[英]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
。 但我的目的是首先檢查obj1
和obj2
可以作為列表,然后進行比較
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.