public static Expression <Action <IEnumerable, TextWriter> > CreateExpression(Type type, string separator = ",") { var members = LocalMemberInfo.FindAll(type).ToList(); var expression = BuildFlattener.CreateWriterExpression(type, members, ','); return(expression); }
public static void Serialize(Type type, TextWriter destination, IEnumerable items) { Action <IEnumerable, TextWriter> writer; lock (_Delegates) { if (!_Delegates.TryGetValue(type, out writer)) { var members = LocalMemberInfo.FindAll(type).ToList(); var expression = BuildFlattener.CreateWriterExpression(type, members, ','); writer = expression.Compile(); _Delegates.Add(type, writer); } } writer.Invoke(items, destination); }
public static void Serialize <TItem, TColumn>(TextWriter destination, IEnumerable <TItem> items, KeyValuePair <string, TColumn>[] columns) { Action <IEnumerable, Array, TextWriter> writer; var pair = new TypePair(typeof(TItem), typeof(TColumn)); lock (_Delegates) { if (!_DelegatesDynamic.TryGetValue(pair, out writer)) { var members = LocalMemberInfo.FindAll(typeof(TItem)).ToList(); var expression = BuildFlattener.CreateWriterExpression(typeof(TItem), typeof(TColumn), members, ','); writer = expression.Compile(); _DelegatesDynamic.Add(pair, writer); } } writer.Invoke(items, columns, destination); }
void WriteDynamicColumns(ParameterExpression itemEx, List <Expression> block, ParameterExpression extraColumnsEx, ParameterExpression columnIndexEx) { var get_Item = itemEx.Type.GetMethod("get_Item", BindingFlags.Public | BindingFlags.Instance, null, new[] { _ColumnType }, null); if (get_Item == null) { throw new ArgumentException(_Type.Name + " does not have an indexer of type " + _ColumnType.Name); } var member = new LocalMemberInfo(get_Item); var loop = new List <Expression>(); var tmp = GetTemporary(member); var value = Expression.Assign( tmp, Expression.Call( itemEx, get_Item, Expression.Property( Expression.ArrayAccess(extraColumnsEx, columnIndexEx), "Value"))); loop.Add(value); MemberToTextWriter(loop, member, _Members.Count, value, Expression.NotEqual(columnIndexEx, Expression.Constant(0))); loop.Add(Expression.PreIncrementAssign(columnIndexEx)); block.Add( Expression.Assign( columnIndexEx, Expression.Constant(0))); var breakLabel = Expression.Label(); block.Add( Expression.Loop( Expression.IfThenElse( Expression.LessThan(columnIndexEx, Expression.ArrayLength(extraColumnsEx)), Expression.Block(loop), Expression.Break(breakLabel)), breakLabel)); }
public static IFlattener CreateFlattener(Type type) { var members = LocalMemberInfo.FindAll(type).ToList(); return(new Flattener(type, members)); }
public static IEnumerable <IMemberInfo> FindAllMembers(Type type) { return(LocalMemberInfo.FindAll(type)); }