4

Roslynを使用して、次のクラスでリフレクションスタイルの操作を実行したいと思います。

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

基本的に私はこれをやりたいのですが、Roslynと一緒に:

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

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が必要です。リフレクションを使用すると、アセンブリを操作しているので、質問のその部分に対する答えがわかりません。これをVisualStudioのRoslyn拡張機能として使用する場合は、これが探しているものになります。

于 2012-05-23T08:15:28.353 に答える
0

ボブ、RoslynCTPとともにインストールされる構文およびセマンティックのウォークスルードキュメントから始めることをお勧めします。これらは、すべてではないにしてもほとんどを示しています。

于 2012-05-23T06:12:34.393 に答える