4

我想使用 Roslyn 对以下类执行反射样式操作:

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 进行类似反射的操作的网站,请随时向我指出那个方向。我一直在寻找几个小时,似乎无法在这方面取得进展。

提前致谢,

鲍勃

4

2 回答 2

7

得到你想要的方法可以这样完成:

    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 扩展,那么这应该是您正在寻找的。

于 2012-05-23T08:15:28.353 回答
0

Bob,我建议您从随 Roslyn CTP 一起安装的语法和语义演练文档开始。它们表明了大部分(如果不是全部)。

于 2012-05-23T06:12:34.393 回答