Cod*_*ler 10 c# generics reflection
namespace GenericsTest
{
public class AGenericClass<T>
{
public class NestedNonGenericClass
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,应该NestedNonGenericClass算是一个泛型类?
反射API说它是一个泛型类,甚至把包含类的模板参数作为嵌套类的模板参数.
Type nestedClass = typeof(AGenericClass<int>.NestedNonGenericClass);
Console.Out.WriteLine("IsGeneric: {0}\tHasGenericArguments: {1}",
nestedClass.IsGenericType, nestedClass.GetGenericArguments().Length > 0);
Run Code Online (Sandbox Code Playgroud)
打印出:
IsGeneric:True HasGenericArguments:True
我不完全同意这种行为.即使编译器为其生成泛型类型NestedNonGenericClass,我也想知道它是否是通用的,因为它是声明的,或者因为它的容器是通用的.
所以,我的问题是:
首先,你认为可以考虑嵌套类泛型,因为它的容器是通用的吗?为什么/为什么不呢?
其次,您是否碰巧知道其他一些API可以帮助我只识别声明为通用的类?
PS:我在ECMA规范中找不到与此相关的任何内容(或者我可能只是掩盖它).
- 编辑 -
为了添加更多的上下文,我正在开发一种代码生成器.我正在使用反射API来确定类型是否是通用的.
我遇到了一个问题Dictionary<TKey, TValue>.KeyCollection.
因为KeyCollection,反射API说它是通用的并且把我交给我,TKey并且TValue在容器中声明了它们.因此,发电机最终产生Dictionary<TKey, TValue>.KeyCollection<Tkey, TValue>
我能解决这个问题的唯一方法是将嵌套类的模板参数与容器匹配,并消除所有匹配的模板参数.但我想知道是否有更好的方法.
Mar*_*ell 19
简而言之,是 - 一个类型从包含它的任何类型继承类型参数:这是类似事物的关键List<T>.Enumerator和许多其他场景等 - 它们T与外部类(不仅仅是任何T)共享是至关重要的.
ECMA参考文献是§25.1:
嵌套在泛型类声明或泛型结构声明(第25.2节)中的任何类本身都是泛型类声明,因为应提供包含类型的类型参数以创建构造类型.
是的,您的嵌套类绝对是通用的,因为T绑定到嵌套类的任何实例范围内的类型(这称为封闭泛型).
using System;
using System.Collections.Generic;
public class AGenericClass<T> {
public class NestedNonGenericClass {
public void DoSomething() {
Console.WriteLine("typeof(T) == " + typeof(T));
}
}
}
public class MyClass {
public static void Main() {
var c = new AGenericClass<int>.NestedNonGenericClass();
var d = new AGenericClass<DateTime>.NestedNonGenericClass();
c.DoSomething();
d.DoSomething();
Console.ReadKey(false);
}
}
Run Code Online (Sandbox Code Playgroud)
DoSomething()根据泛型类型的关闭方式,相同的方法产生不同的输出 - 所以是的,内部类肯定表现出通用行为.