簡體   English   中英

如何將泛型T轉換為特定類型的列表

[英]How to cast a generic Type T to a List of a specific type

我有一個采用通用類型T作為參數的方法。如果T是類型列表,我想將其轉換為列表,其中Y是T中包含的元素的類型。我懷疑我誤解了通用類型的約束類型,但任何幫助將不勝感激。

例:

public void MapData<T>(T genericData)
{
   var genericDataType = genericData.GetType();

   if (genericDataType.Name.Contains("List"))
   {
      //Cast T to a List containing the type of elements contained in T
   }
 }

我需要將genericData強制轉換為一個List,以便可以將其傳遞給另一個帶有簽名的方法:

public void MapListToField<T>(List<T> genericList) 

更新

根據以下Eric的回答,我想分享一下我嘗試過的嘗試,也許有人可以指出我的錯誤。 編譯器指出我正在嘗試將變量用作類型,我理解其含義,但是elementType是類型,因此我不清楚如何解決:

var elementType = genericData.GetType().GetGenericArguments()[0];
var castedList = genericData as List<elementType>;

編輯:這接近您的要求嗎?

碼:

void Main()
{
    List<string> stringlist = new List<string> { "a", "b", "c" };
    List<int> intlist = new List<int> { 1, 2, 3 };
    string notList = "";
    var expression = Expression.Call(typeof(Methods), "CastToList", new Type[] { stringlist.GetType(), stringlist.GetType().GetGenericArguments()[0] }, Expression.Constant(stringlist));
    Expression.Lambda<Func<bool>>(expression).Compile()();
    expression = Expression.Call(typeof(Methods), "CastToList", new Type[] { intlist.GetType(), intlist.GetType().GetGenericArguments()[0] }, Expression.Constant(intlist));
    Expression.Lambda<Func<bool>>(expression).Compile()();
    expression = Expression.Call(typeof(Methods), "CastToList", new Type[] { notList.GetType(), typeof(object) }, Expression.Constant(notList));
    Expression.Lambda<Func<bool>>(expression).Compile()();
}

public static class Methods
{
    public static void MapListToField<T>(List<T> genericList)
    {
        foreach (var element in genericList)
        {
            Console.Write("{0}, ", element.ToString());
        }
        Console.Write("\n");
    }
    public static bool CastToList<L, T>(L obj)
    {
        if (obj.GetType() == typeof(List<T>))
        {
            Console.Write("List contains objects of Type: {0}\n", typeof(T).ToString());
            List<T> genericList = obj as List<T>;
            MapListToField(genericList);
            return true;
        }
        else
        {
            Console.Write("Not list, Type is: {0}\n", typeof(L).ToString());
            return false;
        }
    }
}

結果:

List contains objects of Type: System.String
a, b, c, 
List contains objects of Type: System.Int32
1, 2, 3, 
Not list, Type is: System.String

如果沒有良好的最小,完整和可驗證的代碼示例 ,以及有關您的方案的更多詳細信息,就不可能確定到底哪種方法最好。 那說...

如果您要做的第一件事是檢查對象是否為列表,然后將其傳遞給將對列表進行操作的另一個方法,為什么不對您的方法進行兩次重載呢? 例如:

public void MapData<T>(T genericData)
{
    // do stuff with non-list data
}

public void MapData<T>(List<T> genericList)
{
    MapListToField(genericList);
}

如果同時要針對這兩種類型執行代碼,請將其移至兩個MapData<T>()重載都可以調用的幫助器方法。

無論您如何處理,當前用於檢查List<T>類型的機制都太脆弱了,恕我直言,這是無法挽回的缺陷。 請參閱如何檢查給定值是否為通用列表? 對於更好的方法的一些想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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