我已经创建了一个名为MyModel的实体模型的实例,但是我需要将此实例用作我的助手类中的类型,以便可以将数据表转换为动态创建的任何模型。例如,如果我将实际模型明确传递给helper类,则一切正常:
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是变量,但像类型一样使用”
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
}
答案 0 :(得分: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的反射。然后,您必须调用通用方法并将新对象强制转换为数据表。如果您不使用静态方法,则反转参数
答案 1 :(得分:0)
根据您的描述,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);
如果仍然遇到问题,请与我分享您的源代码。