如何确定T是generics中的值types还是引用类?

我有一个generics方法的行为取决于T是引用types或值types。 它看起来如此:

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 } 

因为他们的签名是平等的。 谁能帮我?

您可以使用genericstypes的typeof运算符 ,因此typeof(T)将获得对应于TType引用,然后使用IsValueType属性:

 if (typeof(T).IsValueType) 

或者,如果您想包含可为空的值types,就好像它们是引用types一样:

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

Type.IsValueType自然会告诉Type是否是一个值types。 因此, typeof(T).IsValueType

[以下答案不检查T静态types,而是检查objdynamictypes。 这不是你所要求的,但是因为它可能对你的问题有用,所以我会保留这个答案作为参考。]

所有的值types(只有那些)从System.ValueType派生。 因此,可以使用以下条件:

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

尝试这个:

 if (typeof(T).IsValueType)