2010-06-23 6 views
0

많은 .cs 파일이 있고 이러한 파일에서 [AcceptVerbs (HttpVerbs.Post)] 특성 뒤에있는 메서드를 자동으로 검색하려고합니다.많은 파일에서 메서드/코드 검색

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult sample(string msg) 
{......} 

출력은 다음과 같습니다 :

때문에 입력은

public ActionResult sample(string msg) 
{......} 

내 생각은 {와} 찾기 위해 RegularExpressions을 사용할 경우 String.indexOf 속성의 위치 을 찾아 계산이다 메소드를 검색하기 위해 메소드 시작 및 끝 위치를 지정하십시오.

(라이브러리, 도구 또는 방법) 다른 방법으로 도움이 될 수 있습니까?

고마워요. 이 당신이 원하는,하지만 당신이 그냥 한 번 일이 가정 반사

public static IList<MemberInfo> GetMethodsImplementing<T>(Assembly assembly) where T : Attribute 
{ 
    var result = new List<MemberInfo>(); 

    var types = assembly.GetTypes(); 
    foreach (var type in types) 
    { 
     if (!type.IsClass) continue; 

     var members = type.GetMembers(); 
     foreach (var member in members) 
     { 
      if (member.MemberType != MemberTypes.Method) 
       continue; 

      var attributes = member.GetCustomAttributes(typeof(T), true /*inherit*/); 
      if (attributes.Length > 0) 
      { 
       // yup. This method implementes MyAttribute 
       result.Add(member); 
      } 
     } 
    } 

    return result; 
} 
+0

본문 또는 선언 만? – MaLio

답변

1

확실하지 않음) 당신은 그것에 대한 정규식 균형을 사용할 수 있습니다.

이 스 니펫은 파일을 가져 와서 .. class .. { .. }을 확인한 다음 String[]으로 반환합니다.

끝에 linq 쿼리에서 AcceptVerbs(HttpVerbs.Post)과 일치하도록 수정해야합니다. 디렉토리를 통해 반복하고 각 .cs 파일에 대해이 작업을 수행하면 코드가 있다고 가정합니다. 마지막으로 {}의 레벨에 따라 다소 수정하고 rx를 사용해야 할 수도 있습니다.

이 테스트 스 니펫은 LinqPad에서 만들었습니다.이 테스트 코드는 다운로드하여 설정하여 테스트 할 수 있습니다. 언어를 C# Program으로 바꾸고, 파일로 인쇄하는 콘솔 앱으로 이동 시키면됩니다.

void Main() 
{ 
    String data = String.Empty; 
    using (StreamReader reader = new StreamReader(@"/path/to/a/file.cs")) 
     data = reader.ReadToEnd(); 

    CheckContents(data, "class").Dump(); 
} 

// Define other methods and classes here 
String[] CheckContents(String data, String pattern) 
{ 
    var rx = new Regex(@"{ 
    (?> 
     { (?<DEPTH>) 
     | 
     } (?<-DEPTH>) 
     | 
     [^}{]* 
    )* 
    (?(DEPTH)(?!)) 
    }", RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline); 

    var rx2 = new Regex(@"[^{]*{ 
    (?> 
     { (?<DEPTH>) 
     | 
     } (?<-DEPTH>) 
     | 
     [^}{]* 
    )* 
    (?(DEPTH)(?!)) 
    }", RegexOptions.IgnorePatternWhitespace | RegexOptions.Multiline); 

    var nameSpace = rx.Match(data).Value.Substring(1); // Remove { from namespace so we don't match the same thing over and over 
    var parts = rx2.Matches(nameSpace); 

    return (from Match part in parts where Regex.IsMatch(part.Value, pattern) select part.Value.Trim()).ToArray(); 
} 
0

를 사용하여 소스 ("균형"당신의 소스 파일에있는 {}의 같은 양의 경우

관련 문제