如何确定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)
将获得对应于T
的Type
引用,然后使用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,而是检查obj
的dynamictypes。 这不是你所要求的,但是因为它可能对你的问题有用,所以我会保留这个答案作为参考。]
所有的值types(只有那些)从System.ValueType
派生。 因此,可以使用以下条件:
if (obj is ValueType) { ... } else { ... }
尝试这个:
if (typeof(T).IsValueType)