簡體   English   中英

無法在C#中將通用類型轉換為列表

[英]Cannot cast a generic type to list in C#

我正在嘗試進行一個簡單的測試,在其中我將兩個通用對象傳遞給測試函數,看看它們是否可以轉換為List<S> ,並進一步檢查列表的計數是否相等。

以下代碼有效:

private static void Test<T> (T obj1, T obj2) {
    if (typeof(T).IsGenericType) {
        var genericTypeParam1 = typeof(T).GetGenericArguments().First();
        Console.WriteLine(genericTypeParam1);

        // LINE MARKER 1
        // var obj1AsList = (obj1 as IEnumerable<genericTypeParam1>);
    }
}

static void Main(string[] args) {
    Test(Enumerable.Range(0, 5).ToList(), Enumerable.Range(0, 5).ToList());
    Console.ReadLine();
}

但如果我取消注釋標有LINE MARKER 1 ,我會收到以下錯誤:

The type or namespace name 'genericTypeParam1' could not be found (are you missing a using directive or an assembly reference?)

我事先不知道Test會收到List 但我的目的是首先檢查obj1obj2可以作為列表,然后進行比較

var obj1AsList = obj1 as List<genericTypeParam1>;
var obj2AsList = obj2 as List<genericTypeParam1>;
var flag = (obj1AsList != null) && (obj2AsList != null) && (obj1AsList.Count() == obj2AsList.Count());

在此先感謝您的幫助。

我正在嘗試進行一個簡單的測試,其中我將兩個對象傳遞給測試函數,看看它們是否可以轉換為List<S> ,並進一步檢查列表的計數是否相等。

正確的方法是:

static bool Test<T>(object obj1, object obj2)
{
    List<T> list1 = obj1 as List<T>;
    List<T> list2 = obj2 as List<T>;
    return list1 != null && list2 != null && list1.Count == list2.Count;
}
...
bool result = Test<int>(Enumerable.Range(0, 5).ToList(), Enumerable.Range(0, 5).ToList());

這需要兩個對象和一個類型,如果對象是該類型的大小相同的列表,則返回true。

提供為泛型類型參數的類型必須在編譯時知道。 你試圖傳遞Type typed變量,這就是你得到編譯類型錯誤的原因。

您可以確定,在編譯期間,只有List<T>實例可以作為方法參數檢查由編譯器進行檢查:

private static void Test<T>(List<T> obj1, List<T> obj2)
{
    var flag = obj1 != null && obj2 != null && obj1.Count == obj2.Count;
}

如果您希望在運行時完成該測試,則應使用Eric提供的解決方案。

如果真正的目標是確保兩個項都可以轉換為某種通用列表類型,那么只需將對象轉換為非通用IList接口。 然后你可以比較計數:

private static bool Test<T>(T obj1, T obj2)
{
    if (typeof(T).IsGenericType)
    {
        var obj1List = obj1 as System.Collections.IList;
        var obj2List = obj2 as System.Collections.IList;

        if (obj1List != null && obj2List != null && obj1List.Count == obj2List.Count)
            return true;
    }
    return false;
}

如果你真的想使用反射,你可能會做出像這樣的工作:

if (typeof(T).IsGenericType) {
        var genericTypeParam1 = typeof(T).GetGenericArguments().First();
        Console.WriteLine(genericTypeParam1);

        // LINE MARKER 1
        // var obj1AsList = (obj1 as IEnumerable<genericTypeParam1>);
        var genericListType = typeof(IEnumerable<>).MakeGenericType(genericTypeParam1);

        Convert.ChangeType(obj1,genericListType);
    }

暫無
暫無

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

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