以编程方式获取嵌套的静态类名称并访问方法

时间:2019-07-18 07:11:23

标签: c#

我有一个像这样的嵌套类结构

public static class Animals{


    private static class Dolphins
    {
        public static int GetAge()
        {

        }
    }

    private static class Cats
    {
        public static int GetAge()
        {

        }
    }

    private static class Dogs
    {
        public static int GetAge()
        {

        }
    }

}

是否可以在for循环中以编程方式获取子类名称,所以我可以为所有这些子类调用GetAge()方法?像这样(伪代码):

foreach(subclass in Animals)
{
   subclass.GetAge()
}

我通过反射进行了尝试,但是我能够获得基类的后代类,而不是像上面的静态基类中嵌套的类。

预先感谢

3 个答案:

答案 0 :(得分:5)

foreach(var type in typeof(Animals).GetNestedTypes(
    BindingFlags.Public | BindingFlags.NonPublic))
{
    var method = type.GetMethod("GetAge", BindingFlags.Static | BindingFlags.Public,
        null, Type.EmptyTypes, null);
    if (method != null)
    {
        int age = (int)method.Invoke(null, null);
        Console.WriteLine(age);
    }
}

答案 1 :(得分:2)

您将希望获得Nested Types

  

GetNestedTypes(BindingFlags)

     

在派生类中重写时,使用指定的绑定约束搜索嵌套在当前Type中的类型。

然后使用Static Binding Flag

  

指定用于控制绑定的标志以及通过反射进行成员和类型搜索的方式。


  

静态-指定要在搜索中包括静态成员。

答案 2 :(得分:1)

如前所述,使用界面会更合适。但是无论如何,这是您所要求的单行实现:

typeof(Animals).GetNestedTypes(BindingFlags.Static | BindingFlags.NonPublic).ToList()
  .ForEach(t => /*do something with the returned value*/t.GetMethod("GetAge", BindingFlags.Static | BindingFlags.Public)?.Invoke(null, null));