Подтвердить что ты не робот

Как определить, является ли 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
}

потому что их подписи равны. Кто-нибудь может мне помочь?

4b9b3361

Ответ 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)