检索所有方法名称

时间:2014-05-13 11:38:40

标签: c# reflection

我试图通过反射在所有类中获取所有方法。我这是我的代码。我可以得到类名,但我不能得到方法名称。我怎么能这样做?

string @namespace = "Application.Main";

List<String> methodNames = new List<string>();
List<String> appServiceClasses = new List<string>();
List<Type> returnVal = AppDomain.CurrentDomain
                                .GetAssemblies()
                                .SelectMany(t => t.GetTypes())
                                .Where(t => t.IsClass && t.Namespace == @namespace).ToList();

for (int i = 0; i < returnVal.Count; i++)
{
    appServiceClasses.Add(returnVal[i].Name);
}

Type myTypeObj = typeof(appServiceClasses[0]);
MethodInfo[] methodInfos = myTypeObj.GetMethods();

foreach (MethodInfo methodInfo in methodInfos)
{
    string a = methodInfo.Name;
}

3 个答案:

答案 0 :(得分:1)

嗯,你已经拥有你的课程类型,为什么你得到他们的名字?我的意思是这样做的目的是什么?您可以使用这些类型实例来获取方法。

var methods = returnVal.SelectMany(x => x.GetMethods());

编辑:您还可以使用Dictionary<string, MethodInfo[]>,这样您就可以访问类的方法,其名称如下:

var methods = returnVal.ToDictionary(x => x.Name, x => x.GetMethods());

var methodsOfFoo = methods["Foo"];

答案 1 :(得分:1)

您不需要存储类型名称,然后使用typeof。您已经拥有类型: -

var appServiceClassTypes = AppDomain.CurrentDomain.GetAssemblies()
                                    .SelectMany(x => x.GetTypes())
                                    .Where(x => x.IsClass && x.Namespace == ...)
                                    .ToList();

var appServiceClasses = appServiceClassTypes.Select(x => x.Name);

var methodNames = appServiceClassTypes.SelectMany(x => x.GetMethods())
                                      .Select(x => x.Name)
                                      .ToList();

如果您实际上并不需要appServiceClasses集合,那么您应该能够将这些集合链接在一起: -

var methodNames = AppDomain.CurrentDomain.GetAssemblies()
                           .SelectMany(x => x.GetTypes())
                           .Where(x => x.IsClass && x.Namespace == ...)
                           .SelectMany(x => x.GetMethods())
                           .Select(x => x.Name)
                           .ToList();

您可能想知道哪些方法属于哪个类,但是: -

var methods = AppDomain.CurrentDomain.GetAssemblies()
                       .SelectMany(x => x.GetTypes())
                       .Where(x => x.IsClass && x.Namespace == ...)
                       .Select(x => new Tuple<string, IEnumerable<string>>(
                           x.Name,
                           x.GetMethods().Select(y => y.Name)));

或: -

var methods = AppDomain.CurrentDomain.GetAssemblies()
                       .SelectMany(x => x.GetTypes())
                       .Where(x => x.IsClass && x.Namespace == ...)
                       .ToDictionary(
                           x => x.Name,
                           x => x.GetMethods().Select(y => y.Name));

答案 2 :(得分:1)

使用类型来询问方法:

for (int i = 0; i < returnVal.Count; i++)
{
  appServiceClasses.Add(returnVal[i].Name);
  MethodInfo[] methodInfos = returnVal[i].GetMethods();

  foreach (MethodInfo methodInfo in methodInfos)
  {
    string a = methodInfo.Name;
  }
}
相关问题