• ToDataTable v2


    DynamicObject & ExpandoObject should be accessed in different way.
     
     
            public static DataTable ToDataTable<T>( IEnumerable<T> input, string tableName)
            {
                var dt = new DataTable();
                dt.TableName = tableName;
     
                if (input == null || !input.Any()) return dt;
                if (typeof (T) == typeof(System. Object))
                {
                    //"T is dynamic type"
                    var first = Enumerable .First(input);
                    if (first is IDictionary< string, object >)  //ExpandoObject also falls into this category         
                    {
                        IDictionary<string , object> properties = ( IDictionary<string , object>)first;
     
                        foreach (var p in properties)
                        {
                            var type = p.Value.GetType();
                            if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>))
                                type = type.GetGenericArguments()[0];
     
                            dt.Columns.Add(p.Key, type);
                        }
     
                        foreach (T r in input)
                        {
                            var values = new object[properties.Count];
                            int i = 0;
                            foreach (var p in properties)
                            {
                                values[i] = (r as IDictionary <string, object>)[p.Key];
                                i++;
                            }
     
                            dt.LoadDataRow(values, true);
                        }
                    }
                   
                    else if (first is System.Dynamic. DynamicObject)
                    {
                        var firstDO = first as System.Dynamic.DynamicObject;
                        var properties = firstDO.GetDynamicMemberNames();
     
                        foreach (var p in properties)
                        {
                            var pObject = GetDynamicMember(first, p);
                            var type = pObject.GetType();
                            if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>))
                                type = type.GetGenericArguments()[0];
     
                            dt.Columns.Add(p, type);
                        }
     
                        foreach (T r in input)
                        {
                            var values = new object[properties.Count()];
                            int i = 0;
                            foreach (var p in properties)
                            {
                                values[i] = GetDynamicMember(r, p);                               
                                i++;
                            }
     
                            dt.LoadDataRow(values, true);
                        }
                    }
     
                }
                else
                {
                    // T is static type               
                    var properties = typeof (T).GetProperties();
     
                    foreach (var p in properties)
                    {
                        var type = p.PropertyType;
                        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable <>))
                            type = type.GetGenericArguments()[0];
     
                        dt.Columns.Add(p.Name, type);
                    }
     
                    foreach (T r in input)
                    {
                        var values = new object[properties.Length];
                        int i = 0;
                        foreach (var p in properties)
                        {
                            values[i] = p.GetValue(r, null);
                            i++;
                        }
     
                        dt.LoadDataRow(values, true);
                    }
                }
                return dt;
            }
           
            //todo cache the callsite
            private static object GetDynamicMember( object obj, string memberName)
            {
                var binder = Binder .GetMember(CSharpBinderFlags.None, memberName, obj.GetType(),
                    new[] { CSharpArgumentInfo .Create(CSharpArgumentInfoFlags.None, null) });
                var callsite = CallSite <Func< CallSite, object , object>>.Create(binder);
                return callsite.Target(callsite, obj);
            }

  • 相关阅读:
    手搓一个兔子问题(分享一个C语言问题,持续更新...)
    一个C语言萌新的学习之旅(持续更新中...)
    ...续上文(一个小萌新的C语言之旅)
    手搓一个C语言简单计算器。
    嘿,C语言(持续更新中...)
    一个博客萌新的博客之旅。。。。
    vue+uikit3+laravel快速建站
    mpvue开发博客园小程序
    C语言俄罗斯方块小游戏练习
    c语言贪吃蛇小游戏练习
  • 原文地址:https://www.cnblogs.com/gunsmoke/p/2501445.html
Copyright © 2020-2023  润新知