namespace GenericsTest
{
public class AGenericClass<T>
{
public class NestedNonGenericClass
{
}
}
}
В приведенном выше примере следует NestedNonGenericClass
считать общий класс?
API отражения говорит об этом универсальном классе и даже передает мне параметры шаблона содержащего класса в качестве параметров шаблона вложенного класса.
Type nestedClass = typeof(AGenericClass<int>.NestedNonGenericClass);
Console.Out.WriteLine("IsGeneric: {0}\tHasGenericArguments: {1}",
nestedClass.IsGenericType, nestedClass.GetGenericArguments().Length > 0);
Это выдает:
IsGeneric: True HasGenericArguments: True
Я не совсем согласен с этим поведением. Даже если компилятор генерирует общий тип для NestedNonGenericClass
, я хотел бы знать, является ли это общим, потому что он был объявлен так или потому, что контейнер является общим.
Итак, мой вопрос:
Во-первых, вы считаете, что нормально рассматривать вложенный класс generic, потому что контейнер является общим? Почему/почему?
Во-вторых, знаете ли вы, что какой-то другой API, который может помочь мне идентифицировать только классы, объявленные как общие?
P.S: Я не мог найти ничего связанного с этим в спецификациях ECMA для дженериков (или, возможно, просто замаскировал его).
- EDIT -
Чтобы добавить немного больше контекста, я работаю над генератором кода. И я использую API отражения, чтобы определить, является ли тип общим.
У меня возникла проблема с Dictionary<TKey, TValue>.KeyCollection
.
В KeyCollection
API отражения говорит, что он общий и передает мне сообщения TKey
и TValue
, которые были объявлены в контейнере. Таким образом, генератор заканчивает создание Dictionary<TKey, TValue>.KeyCollection<Tkey, TValue>
Единственный способ решить эту проблему - сопоставить параметры шаблона вложенного класса с контейнером и устранить все те, которые соответствуют. Но мне было интересно, есть ли лучший подход.