簡體   English   中英

使用 C# 類型的動態類類型列表

[英]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類型,該類型僅在運行時已知。

因此,除了將其強制轉換為IListIEnumerable以迭代元素(例如使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM