C# 访问泛型类型的静态嵌套类
我有一门课:C# 访问泛型类型的静态嵌套类,c#,generics,C#,Generics,我有一门课: class MyClass { public static class MyNestedClass { public const int M1 = 1; public const int M2 = 2; } } class MyClass2 { public static class MyNestedClass { public const int M1 = 1; public cons
class MyClass
{
public static class MyNestedClass
{
public const int M1 = 1;
public const int M2 = 2;
}
}
class MyClass2
{
public static class MyNestedClass
{
public const int M1 = 1;
public const int M2 = 2;
}
}
和一个通用函数:
private static void Work<T>()
{
Type myType = typeof(T.MyNestedClass);
myType.GetFields().Select(....);
// .. use T here as well..
}
通过
Work<MyClass, MyClass.MyNestedClass>();
Work();
给我错误:静态类型不能用作类型参数
访问c#中嵌套的静态和非静态类的正确方法是什么?类型
T
没有名为MyNestedClass
的嵌套类型,除非您指定T
实际上是MyClass
。然后可以使用GetNestedTypes()
方法检索嵌套类型:
private static void Work<T>() where T : MyClass
{
Type myType = typeof(T).GetNestedTypes().FirstOrDefault();
//...
}
private static void Work(),其中T:MyClass
{
类型myType=typeof(T).GetNestedTypes().FirstOrDefault();
//...
}
还有一个GetNestedType
方法也可以接受类型名string
但是您不能使用约束强制特定类型具有嵌套类型。
私有静态void Work(),其中t:MyClass
不知道这是否也可以工作:)为什么在这里使用嵌套类?对我来说,这似乎是一种可怕的代码气味。静态类型不能用作泛型参数。你不能做列表
。。。即使MyNestedClass
没有嵌套,它也不会改变任何东西。请记住,无论您在代码中通过名称标识类型,编译器都必须标识您正在谈论的类型,并将标识特定类型的标记放入IL中,该类型可以是具体类型,也可以是泛型类型参数。当您说类似A.B.C
的话时,发出的类型标记是针对C
。它不是“先找到类型/名称空间A
,然后分别在其中找到B
,然后再在其中找到C
。@AshishNegi:您不能使用约束强制类型具有嵌套类型…GetNestedType(“任务”)如果我必须使用反射,则更好。T:MyClass
泛型的意义是什么?你最好使用MyClass
代替T
?@Liam:是的,除非MyClass是某种基类或接口。@Liam我有多个具有相同嵌套类的类。现实世界用例:multipleEventSource
和任务
嵌套类。“不能使用约束强制特定类型具有嵌套类型…”+1
private static void Work<T>() where T : MyClass
{
Type myType = typeof(T).GetNestedTypes().FirstOrDefault();
//...
}