[英]How to determine whether T is a value type or reference class in generic?
我有一個泛型方法的行為取決於 T 是引用類型還是值類型。 看起來是這樣的:
T SomeGenericMethod <T> (T obj)
{
if (T is class) //What condition I must write in the brackets?
//to do one stuff
else //if T is a value type like struct, int, enum and etc.
//to do another stuff
}
我不能像這樣復制這個方法:
T SomeGenericMethod <T> (T obj) where T : class
{
//Do one stuff
}
T SomeGenericMethod <T> (T obj) where T : struct
{
//Do another stuff
}
因為他們的簽名是相等的。 誰能幫我?
您可以將typeof
運算符用於泛型類型,因此typeof(T)
將獲取與T
對應的Type
引用,然后使用IsValueType
屬性:
if (typeof(T).IsValueType)
或者,如果您想包含可為 null 的值類型,就好像它們是引用類型一樣:
// Only true if T is a reference type or nullable value type
if (default(T) == null)
[以下答案不檢查T
的靜態類型,而是檢查obj
的動態類型。 這不完全是您所要求的,但由於無論如何它可能對您的問題有用,因此我會保留此答案以供參考。]
所有值類型(並且僅那些)派生自System.ValueType
。 因此,可以使用以下條件:
if (obj is ValueType) {
...
} else {
...
}
Type.IsValueType
自然會告訴Type
是否是值類型。 因此, typeof(T).IsValueType
。
試試這個:
if (typeof(T).IsValueType)
我參加聚會遲到了,但我只是偶然發現了這一點。 因此,在確定它是否是引用類型時,
typeof(T).IsClass
分別
obj.GetType().IsClass
可以工作(.net 4.7+,未檢查以前的版本)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.