コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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));
        }
コード例 #5
0
        public static IFlattener CreateFlattener(Type type)
        {
            var members = LocalMemberInfo.FindAll(type).ToList();

            return(new Flattener(type, members));
        }
コード例 #6
0
 public static IEnumerable <IMemberInfo> FindAllMembers(Type type)
 {
     return(LocalMemberInfo.FindAll(type));
 }