如何确定T是泛型中的值类型还是引用类?

时间:2011-09-28 08:23:38

标签: c# .net generics

我有一个泛型方法行为,它依赖于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
}

因为他们的签名是平等的。任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:76)

您可以将typeof operator与泛型类型一起使用,因此typeof(T)将获得与T对应的Type引用,然后使用IsValueType属性:

if (typeof(T).IsValueType)

或者,如果您想将可空值类型包含为引用类型:

// Only true if T is a reference type or nullable value type
if (default(T) == null)

答案 1 :(得分:6)

当然,

Type.IsValueType告诉Type是否为值类型。因此,typeof(T).IsValueType

答案 2 :(得分:6)

[以下答案不会检查T静态类型,而是obj动态类型。这不是完全您要求的内容,但由于它可能对您的问题有用,我会保留此答案以供参考。]

所有值类型(仅限那些)派生自System.ValueType。因此,可以使用以下条件:

if (obj is ValueType) {
    ...
} else {
    ...
}

答案 3 :(得分:5)

试试这个:

if (typeof(T).IsValueType)

答案 4 :(得分:3)

我参加聚会很晚,但是我偶然发现了这个问题。 因此,确定它是否为引用类型

typeof(T).IsClass

分别

obj.GetType().IsClass

可以正常工作(.net 4.7+,以前的版本未选中)