3

IBus.Publish<T>(NServiceBus から)メソッドを呼び出すソリューション内のすべての場所を見つけようとしています。これまでのところ、これは機能しています:

IMethodSymbol method = ... [IBus.Publish methodsymbol resolved];
var callers = method.FindCallers(solution, new CancellationToken());

これにより、IEnumerable<SymbolCallerInfo>このメソッドへのすべての正しい参照が得られます。

IBus.Publish呼び出されたジェネリック引数を取得するにはどうすればよいですか? ソースツリーを手動で解析する必要がありますか、それとも利用できる Roslyn マジックが存在しますか?

例:

私のコードには次のものがあります。

IBus _bus;

_bus.Publish<IMyMessage>(msg => { msg.Text = "Hello world"});

IMyMessageタイプを取得することに興味があります。

助けてくれてありがとう!

4

2 に答える 2

5

SemanticModelaを使用しSyntaxNodeて、呼び出しの から実際のに移動できます。その後、プロパティをMethodSymbol読み取って、引数の s を取得できます。は型推論を実行するため 、引数が明示的に指定されていない場合でも機能します。TypeArgumentsTypeSymbolSemanticModel

例えば:

var callers = method.FindCallers(solution, CancellationToken.None);
foreach (var caller in callers)
{
    foreach (var location in caller.Locations)
    {
        if (location.IsInSource)
        {
            var callerSemanticModel = solution
                .GetDocument(location.SourceTree)
                .GetSemanticModel();
            var node = location.SourceTree.GetRoot()
                .FindToken(location.SourceSpan.Start)
                .Parent;
            var symbolInfo = callerSemanticModel.GetSymbolInfo(node);
            var calledMethod = symbolInfo.Symbol as IMethodSymbol;
            if (calledMethod != null)
            {
                var arguments = calledMethod.TypeArguments;
            }
        }
    }
}
于 2013-10-17T13:50:45.283 に答える