2012-05-23 73 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); 
    } 
} 

基本上,我想获得符合我在上面反射示例中使用的标准的方法列表。另外,如果有人知道一个网站,解释如何做像罗斯林的操作反思,请随时指向我的方向。我一直在寻找几个小时,似乎无法在这方面取得进展。

由于提前,

鲍勃

回答

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