簡體   English   中英

C#類型的空列表

[英]C# type of empty list

我可以得到一種非空列表:

private Type GetListType(IEnumerable list)
{
  return list.GetType().GetGenericArguments()[0];
}

我如何獲得一種空清單?

private Type GetListType(IEnumerable list)
{
...
}

您的代碼也適用於空列表。 [0]GetGenericArguments調用返回的類型參數數組的索引器,而不是列表內容。

您擁有的代碼有效,例如

GetListType(new List<string>()); // typeof(string)

如果運行時類型沒有通用參數(例如,

public class MyList : List<SomeObject> { }
GetListType(new MyList()); // there is no 0'th generic argument!

否則它可能無法返回您的期望:

GetListType(new Dictionary<string, int>()); // typeof(string)
// even though it ought to be KeyValuePair<string, int>

也許您應該改用以下方法:

private Type GetListType<T>(IEnumerable<T> list)
{
  return typeof(T);
}

最大的缺點是您的類型必須實現IEnumerable<T> ,而不僅僅是IEnumerable (但是,如果您想從空列表中獲取有用的類型,則必須這樣做,否則無論如何都要聲明其類型) 。

正如其他人指出的那樣,您擁有的代碼可以與空集合一起正常工作。 但是,僅當集合類型直接包含泛型變量時,它才起作用。 它不適用於具體的收藏。 例如

class IntList : List<int> { } 

GetListType(new List<int>()) // Works
GetListType(new IntList())   // Fails

IntList類型沒有通用參數,因此索引操作[0]將失敗。

為了實現更通用的實現,您應該選擇一個特定的接口或類類型,以在其中查詢通用參數。 我會推薦IEnumerable<T>

static Type GetListType(IEnumerable enumerable)
{
    var type = enumerable.GetType();
    var enumerableType = type
        .GetInterfaces()
        .Where(x => x.GetGenericTypeDefinition() == typeof(IEnumerable<>))
        .First();
    return enumerableType.GetGenericArguments()[0];
}

暫無
暫無

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

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