[英]Dynamic Class Type List Using Type C#
如何使用 C# 類型動態初始化動態列表。 我試過這個,但未能將類設置為類型。
我只是在閱讀一個數據表,然后創建一個泛型類列表。
例子
//Fetching assembly
Type model = Type.GetType($"{Assembly.GetExecutingAssembly().GetName().Name}.Models.{className}");
DataTable tbl = dataSet.Tables[0];
List<model> genTbl = ConvertDataTable<model>(tbl);
private static List<T> ConvertDataTable<T>(DataTable dt)
{
List<T> data = new List<T>();
foreach (DataRow row in dt.Rows)
{
T item = GetItem<T>(row);
data.Add(item);
}
return data;
}
private static T GetItem<T>(DataRow dr)
{
Type temp = typeof(T);
T obj = Activator.CreateInstance<T>();
foreach (DataColumn column in dr.Table.Columns)
{
foreach (PropertyInfo pro in temp.GetProperties())
{
if (pro.Name == column.ColumnName)
pro.SetValue(obj, dr[column.ColumnName], null);
else
continue;
}
}
return obj;
}
但這是錯誤的,請讓我知道我怎樣才能做到這一點?
動態和對象也不起作用,因為通用方法 GetItem 在對象/動態的情況下不返回任何內容。
更新后沒有運氣。
//Fetching assembly
Type model = Type.GetType($"{Assembly.GetExecutingAssembly().GetName().Name}.Models.{tblName}");
Type elementType = typeof(List<>);
Type typedListType = listType.MakeGenericType(List<string>())
object listInstance = Activator.CreateInstance(typedListType);
IList listInstanceAsIList = (IList)listInstance;
List<model> genTbl = ConvertDataTable<model>(tbl);
您可以使用反射來調用具有編譯時未知類型的泛型方法。 但是,您永遠不會從ConvertDataTable
獲得強類型列表:
Type model = Type.GetType($"{Assembly.GetExecutingAssembly().GetName().Name}.Models.{className}");
DataTable tbl = dataSet.Tables[0];
MethodInfo method = typeWhereConvertDataTableIsDefined.GetMethod("ConvertDataTable");
MethodInfo generic = method.MakeGenericMethod(model);
var result = generic.Invoke(null, null);
然而, Invoke
只會返回一個object
。 在編譯時無法將其轉換回實際的model
類型,該類型僅在運行時已知。
因此,除了將其強制轉換為IList
或IEnumerable
以迭代元素(例如使用foreach
)之外,您不能對該結果做太多事情:
var theList = (IList) result;
foreach(object o in theList)
// DoSomething
如果元素的類型是dynamic
(C# 關鍵字),則List<dynamic>
是最明智的選擇。
當你想生成一個特定的、已知類型的列表時,你可以使用反射:
Type elementType = typeof(List<>);
Type typedListType = listType.MakeGenericType(yourTypeInstance);
object listInstance = Activator.CreateInstance(typedListType);
IList listInstanceAsIList = (IList)listInstance;
當您想要一個方法處理任何類型的列表時,您可以改用泛型,但這在這里似乎並不相關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.