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:
Правда
Я не совсем согласен с таким поведением. Даже если компилятор генерирует универсальный тип для NestedNonGenericClass
, я хотел бы знать, является ли он универсальным, потому что он был объявлен так, или потому что его контейнер является универсальным.
Итак, мой вопрос:
Во-первых, как вы думаете, можно ли считать вложенный класс универсальным, поскольку его контейнер является универсальным? Почему / почему нет?
Во-вторых, знаете ли вы какой-то другой API, который может помочь мне идентифицировать только классы, которые были объявлены универсальными?
P.S .: Я не смог найти ничего, связанного с этим, в спецификациях ECMA для дженериков (или, возможно, я просто упустил это из виду).
- EDIT -
Чтобы добавить немного контекста, я работаю над своего рода Генератором кода. И я использую API отражения, чтобы определить, является ли тип универсальным.
У меня возникла проблема с Dictionary<TKey, TValue>.KeyCollection
.
Для KeyCollection
API-интерфейс отражения говорит, что он универсальный, и передает мне TKey
и TValue
, которые были объявлены в контейнере. Таким образом, генератор в конечном итоге генерирует Dictionary<TKey, TValue>.KeyCollection<Tkey, TValue>
Единственный способ решить эту проблему - сопоставить параметры шаблона вложенного класса с параметрами контейнера и исключить все совпадающие. Но мне было интересно, есть ли лучший подход.