【发布时间】:2013-10-17 21:50:45
【问题描述】:
我正在尝试在调用方法 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 类型。
非常感谢您的帮助!
【问题讨论】:
-
为什么不使用反射来做到这一点? :)
-
@animaonline 因为在迭代 n 个解决方案时使用反射来执行此操作,会导致加载不同程序集、影子复制等混乱……我试过了。 :) 此外,Roslyn 是解决此类问题的最佳方式 :)
-
好的,'FindCallers' 方法是实际方法吗?好像没找到
-
@animaonline 是的,它是 ISymbol 的扩展方法。 IMethodSymbol 又继承 ISymbol
-
您能解释一下为什么要查找所有调用 Publish 的代码吗?我认为您正在构建的东西对我们来说也可能非常有趣。