Почему IsGenericTypeDefinition возвращает false? - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь понять IsGenericTypeDefinition свойство Type.Как я понимаю, это просто шаблон класса без каких-либо замещенных типов (и мы не можем создать экземпляр этого класса).Вот код моей тестовой программы:

class Test
{
    public class MyList<T> : List<T>
    {
    }
    public static void Main()
    {
    Console.WriteLine(typeof(MyList<>).GetMethod("Add").DeclaringType.IsGenericTypeDefinition);
    }
}

Почему программа печатает false?Я просто получаю информацию об этом методе из определения универсального типа.Почему у него нет общего определения типа?Это ошибка?

1 Ответ

0 голосов
/ 04 июня 2018

Поскольку DeclaringType в этом случае является экземпляром List<> для параметра универсального типа T, принадлежащего MyList<T>.

Чтобы получить неинстанцированный универсальный тип, вам нужно использовать GetGenericTypeDefinition, который вернет List<>

typeof(MyList<>).GetMethod("Add").DeclaringType.GetGenericTypeDefinition() 

Детализация чуть глубже, мы получаем:

var instantiationListArgs = typeof(MyList<>).GetMethod("Add").DeclaringType.GetGenericArguments();
var myListArg = typeof(MyList<>).GetGenericArguments();
var listArgs = typeof(List<>).GetGenericArguments();
Console.WriteLine(myListArg[0] == instantiationListArgs[0]); // Will output true, List was instantiated for the T in MyList
Console.WriteLine(listArgs[0] == instantiationListArgs[0]); // Will be false. The generic argument is different then the T in the free List<>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...