簡體   English   中英

如何確定 T 是泛型中的值類型還是引用類?

[英]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.

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