我有一个泛型方法行为,它依赖于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
}
因为他们的签名是平等的。任何人都可以帮助我吗?
答案 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+,以前的版本未选中)