如何确定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 } 

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

4 Solutions collect form web for “如何确定T是generics中的值types还是引用类?”

您可以使用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) 
  • 不能明确地专门化一个generics函数
  • Java中的通用树实现
  • 将事件转换为任务的可重用模式
  • C#添加两个通用值
  • 两个C#扩展通用方法之间的模糊调用其中T:class和其他T:struct
  • Javagenerics益智游戏,扩展类和使用通配符
  • Mockito:使用通用参数进行validation
  • 如何在C#中为generics类创build别名?
  • C#与Javagenerics
  • 构造函数的参考 - 创buildgenerics数组时没有警告
  • C#generics“哪里约束”与“任何genericstypes”的定义?