Как исправить "T" является "параметром типа", но используется как ошибка компиляции переменной

Мне нужно проверить, является ли параметр типового типа T MyEntity или его подклассом.

Код ниже вызывает ошибку компилятора:

'T' is a 'type parameter' but is used like a 'variable'

как исправить?

public class MyEntity { }

static void Test<T>()
{
    // Error    34  'T' is a 'type parameter' but is used like a 'variable'
    if (T is MyEntity)
    {
    }
}

Ответы

Ответ 1

Вы можете использовать метод IsAssignableFrom на Type, чтобы проверить, может ли один Type присваиваться другому.

if (typeof(MyEntity).IsAssignableFrom(typeof(T)))

Примечание. Если вы хотите, чтобы T мог только быть MyEntity или подклассы, вы можете определить общее ограничение, например:

static void Test<T>() where T : MyEntity
{

}

И код типа Test<object>() даже не компилирует


Вы можете проверить IsAssignableFrom на этот код:

public static void F<T>()
{
    var isAssignable = typeof(IEnumerable).IsAssignableFrom(typeof(T));

    Console.WriteLine ("{0} is {1} IEnumerable", typeof(T).Name, isAssignable ? "" : "not");
}

Примеры:

F<IList>();       //prints IList is IEnumerable
F<IEnumerable>(); //prints IEnumerable is IEnumerable
F<object>();      //prints object is not IEnumerable