【问题标题】:Casting a DataTable into a dynamically created entity model?将 DataTable 转换为动态创建的实体模型?
【发布时间】:2018-12-14 13:24:23
【问题描述】:

我创建了一个名为 MyModel 的实体模型的实例,但我需要将此实例用作我的帮助程序类中的类型,以便我可以将数据表转换为动态创建的任何模型。如果我将实际模型显式传递给辅助类,则一切正常:

var data = Helper.DataTableToList<MyActualEntity>(datatable);

但我需要动态地执行此操作。 这是我的助手类

 public static class Helper
    {
        /// <summary>
        /// Converts a DataTable to a list with generic objects
        /// </summary>
        /// <typeparam name="T">Generic object</typeparam>
        /// <param name="table">DataTable</param>
        /// <returns>List with generic objects</returns>
        public static List<T> DataTableToList<T>(this DataTable table) where T : class, new()
        {
            try
            {
                List<T> list = new List<T>();

                foreach (var row in table.AsEnumerable())
                {
                    T obj = new T();

                    foreach (var prop in obj.GetType().GetProperties())
                    {
                        try
                        {
                            PropertyInfo propertyInfo = obj.GetType().GetProperty(prop.Name);
                            propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null);
                        }
                        catch
                        {
                            continue;
                        }
                    }

                    list.Add(obj);
                }

                return list;
            }
            catch
            {
                return null;
            }
        }
    }

这是我通过表名动态创建实体。它工作正常,直到我需要将它们的类型传递给 Helper 类并且我收到错误 “MyModel is a variable but is used like a type”

var assembly = AppDomain.CurrentDomain.GetAssemblies()
    .Where(x => x.FullName.Contains("MyNameSpace.Model")).FirstOrDefault();
var type = assembly.GetTypes()
    .FirstOrDefault(t => t.Name == tableName);

if (type != null)
{
    System.Data.Entity.DbSet myDbSet = ctx.Set(type);                       
   var MyModel = myDbSet.Create(); <--Entity is created

    var data = Helper.DataTableToList<MyModel>(dt);  <--Errors here                           
}

【问题讨论】:

标签: c# entity-framework


【解决方案1】:
System.Reflection.MethodInfo MI = typeof(Helper).GetMethod("DataTableToList");   
System.Reflection.MethodInfo generic = MI.MakeGenericMethod(MyModel.GetType());    
var data = generic.Invoke(null, new object[] { //YourDataTableHere });

你必须像上面提到的@dbc 那样使用反射。然后你必须调用泛型方法并将一个新对象转换为你的数据表。如果您不使用静态方法,则反转参数

【讨论】:

    【解决方案2】:

    根据您的描述,Helper 方法是 DataTable 上的扩展方法,因此您应该使用以下代码行:

    var data = dt.DataTableToList<MyModel>();
    

    您可以对任何类型的模型使用相同的代码,因为它是通用方法。 我最后执行的示例代码。 助手类扩展:

    public static List<T> DataTableToList<T>(this DataTable table) where T : class, new()
            {
                try
                {
                    List<T> list = new List<T>();
    
                    foreach (DataRow row in table.Rows)
                    {
                        T obj = new T();
    //change made at this line
                        foreach (var prop in obj.GetType().GetProperties())
                        {
                            try
                            {
                                PropertyInfo propertyInfo = obj.GetType().GetProperty(prop.Name);
                                propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null);
                            }
                            catch
                            {
                                continue;
                            }
                        }
    
                        list.Add(obj);
                    }
    
                    return list;
                }
                catch
                {
                    return null;
                }
            }
    

    模型类:

     public class Data
            {
                public string Client_Description { get; set; }
                public string Client_Code { get; set; }
                public string Brand_Description { get; set; }
                public string Brand_Code { get; set; }
            }
    

    调用方法:

    DataTable inputData = null; // Get the DataTable
    

    电话分机方法:

    var dataList = inputData.DataTableToList<Helper.Data>();
    

    或者

    var data = Helper.DataTableToList<Helper.Data>(inputData);
    

    如果您仍然遇到问题,请与我分享您的源代码。

    【讨论】:

    • 这不起作用它给出了同样的错误 'MyModel' is a variable but is used like a type
    • 我最后执行了相同的代码,它对我有用。你能告诉我这个“dt”变量是在哪里创建的吗?我正在编辑我之前的回复以了解更多详情。
    • 我明白你的意思,但问题是课程将是动态的。在您的情况下,您明确设置了 Helper.Data 类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    相关资源
    最近更新 更多