Как определить, является ли T типом значения или ссылочным классом в общем?
У меня есть общий метод, поведение которого зависит от 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
}
потому что их подписи равны. Кто-нибудь может мне помочь?
Ответы
Ответ 1
Вы можете использовать typeof
оператор с общими типами, поэтому typeof(T)
получит Type
, соответствующий T
, а затем используйте свойство IsValueType
:
if (typeof(T).IsValueType)
Или если вы хотите включить типы значений с нулевым значением, как если бы они были ссылочными типами:
// Only true if T is a reference type or nullable value type
if (default(T) == null)
Ответ 2
Type.IsValueType
, естественно, если Type
- тип значения. Следовательно, typeof(T).IsValueType
.
Ответ 3
[Следующий ответ не проверяет статический тип T
, а динамический тип obj
. Это не совсем то, о чем вы просили, но так как это может быть полезно для вашей проблемы, я сохраню этот ответ для справки.]
Все типы значений (и только те) получены из System.ValueType
. Таким образом, можно использовать следующее условие:
if (obj is ValueType) {
...
} else {
...
}
Ответ 4
попробуйте следующее:
if (typeof(T).IsValueType)