2014-05-13 1 views
0

모든 리플렉션을 사용하여 모든 메서드에서 모든 메서드를 가져 오려고합니다. 나는 내 코드를 여기에있다. 클래스 이름을 얻을 수 있지만 메소드 이름을 가져올 수 없습니다. 내가 어떻게 할 수 있니?모든 메서드 이름 검색

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; 
} 
+0

'대해서 typeof (appServiceClasses [0])'이 컴파일은? –

+0

아니요. 나는 길을 많이 시도한다. 그것은 typeof (CLASS)가되어야하지만 클래스 이름이 문자열이다. 어떻게 할 수 있는가? – Curious

답변

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"]; 
+0

어떤 방법이 어떤 수업에 속하는지 알 필요가 있지만 길을 따라 가면 할 수 있습니다. 고맙습니다. – Curious

+0

메소드 목록을 공개 또는 비공개로 필터링 할 수 있습니까? – Curious

+0

@TamerMemili 메소드의 컬렉션에 대해'Enumerable.Where' 메소드를 사용합니다 :'var publicMethods = methods.Where (x => x.IsPublic); ' –

1

typeof을 사용하십시오. 당신이 실제로 어느 곳에서나 appServiceClasses 수집이 필요하지 않은 경우

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(); 

, 당신은 단지 그 함께 체인 수 있어야한다 : - - : 당신은 이미 형이

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)); 
방법하지만 어떤 클래스에 속하는
+0

안녕하세요 이아 인, 도와 줘서 고마워요. 제게 많은 도움이됩니다. – Curious

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; 
    } 
}