如何确定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) 
  • 如何检查一个variables是否是某种IEnumerable
  • 单个DAO和通用的CRUD方法(JPA / Hibernate + Spring)
  • 随机化一个List <T>
  • 如何使用generics协议作为variablestypes
  • 在C#中有参数约束的通用构造函数吗?
  • 不能明确地专门化一个generics函数
  • generics返回types的上界 - 接口与类 - 令人惊讶的有效的代码
  • C# - 使用List <T> .Find()与自定义对象
  • 类是一个原始types。 genericstypes<T>的引用应该被参数化
  • 该types必须是引用types才能在通用types或方法中将其用作参数“T”
  • 为什么Javagenerics支持原始types?