2012-05-23 3 views
2

를 사용하여 반사 작업을 수행 할 수있는 방법은 로슬린 사용하여 다음 클래스에 반사 스타일의 작업을 수행 할 수 싶습니다로슬린

public abstract class MyBaseClass 
{ 
    public bool Method1() 
    { 
     return true; 
    } 
    public bool Method2() 
    { 
     return true; 
    } 
    public void Method3() 
    { 
    } 
} 

는 기본적으로 나는이 작업을 수행 할 수 있지만, 로슬린로 :

BindingFlags flags = BindingFlags.Public | 
        BindingFlags.Instance; 
MethodInfo[] mBaseClassMethods = typeof(MyBaseClass).GetMethods(flags); 
foreach (MethodInfo mi in mBaseClassMethods) 
{ 
    if (mi.GetParameters().Length == 0 && mi.ReturnType == typeof(void)) 
    { 
     methodInfos.Add(mi); 
    } 
    if (mi.GetParameters().Length == 0 && mi.ReturnType == typeof(bool)) 
    { 
     methodInfos.Add(mi); 
    } 
} 

본질적으로, 위의 리플렉션 예제에서 사용한 기준을 충족하는 메소드 목록을 얻고 싶습니다. 또한 누군가가 Roslyn에서 Reflection과 같은 작업을 수행하는 방법을 설명하는 사이트를 알고 있다면 그 방향으로 나를 가리켜 주시기 바랍니다. 나는 몇 시간 동안 조사를 해왔고 이것에 대해 진전을 보일 수없는 것처럼 보입니다. 사전에

감사합니다,

답변

4

는 다음과 같이 수행 할 수 있습니다

public static IEnumerable<MethodDeclarationSyntax> BobsFilter(SyntaxTree tree) 
    { 
     var compilation = Compilation.Create("test", syntaxTrees: new[] { tree }); 
     var model = compilation.GetSemanticModel(tree); 

     var types = new[] { SpecialType.System_Boolean, SpecialType.System_Void }; 

     var methods = tree.Root.DescendentNodes().OfType<MethodDeclarationSyntax>(); 
     var publicInternalMethods = methods.Where(m => m.Modifiers.Any(t => t.Kind == SyntaxKind.PublicKeyword || t.Kind == SyntaxKind.InternalKeyword)); 
     var withoutParameters = publicInternalMethods.Where(m => !m.ParameterList.Parameters.Any()); 
     var withReturnBoolOrVoid = withoutParameters.Where(m => types.Contains(model.GetSemanticInfo(m.ReturnType).ConvertedType.SpecialType)); 

     return withReturnBoolOrVoid; 
    } 

당신은에 대한 SyntaxTree가 필요합니다. 리플렉션을 사용하면 어셈블리를 사용하고 있으므로 질문의 해당 부분에 대한 대답을 알 수 없습니다. 이것을 Visual Studio의 Roslyn 확장 기능으로 사용하려면이 기능을 사용해야합니다.

+0

예, 이것이 내가 찾고 있었던 것입니다. 감사! 나는 오늘 밤 그것을 시험해보고 그것이 어떻게 작동 하는지를 볼 것입니다. – Beaker

+0

네, 이것이 제가 필요한 것입니다. 감사! – Beaker

0

밥, 난 당신이 로슬린 CTP와 함께 설치되는 구문 및 시맨틱 연습 문서로 시작하는 것이 좋습니다. 그들은 이것 전부가 아니라고 대부분을 나타냅니다. 당신이 원하는 방법을 얻기

+1

Microsoft에서 Roslyn에 대해 발표 한 모든 단일 문서를 읽었습니다. 나는이 모든 다른 정보를 내가 요구 한 특정 시나리오에서 작동하는 코드로 조각하는 데 어려움을 겪고 있었다. – Beaker