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我有多个具有相同嵌套类的类。现实世界用例:multiple
EventSource
任务
嵌套类。“不能使用约束强制特定类型具有嵌套类型…”+1
private static void Work<T>() where T : MyClass
{
    Type myType = typeof(T).GetNestedTypes().FirstOrDefault();
    //...
}