【问题标题】:How can I determine which class called a public method on an interface?如何确定接口上哪个类调用了公共方法?
【发布时间】:2026-01-14 04:00:01
【问题描述】:

我正在从事一个严重依赖 NServiceBus 的项目。不幸的是,它变得有点混乱,即使它是用 C# 编写的,也有一些混乱。例如,我在某处有Bus.Publish(A),然后在其他地方是public AHandler : IHandleMessages<A>,这可能很好,但由于这是一个 P/S 模式,因此通常有多个处理程序。记住项目有一些内在的需求,新开发人员很难遵循代码流。

我对此的解决方案是创建一个控制台应用程序,或者可能是某种 UI,它会使用反射来扫描程序集并为我绘制我的项目地图。到目前为止,我已经能够有效地获取所有 public class _Handler : IHandleMessages<_>,这很棒,但现在我需要确定消息的来源。

特别是,我想知道是否有一种方法可以使用反射来确定在哪些类中调用Bus.Publish(_)(Bus 实际上是 IBus 的一个实例)。例如,如果public void Handler(A a) { Bus.Publish(B) } 我想知道传递给Bus.Publish() 的参数(所以B)以及包含此处理程序的类的名称。

【问题讨论】:

  • 我不知道 NServiceBus 但你不能回顾一下调用堆栈吗?
  • 使用StackTrace
  • 这似乎是合理的,只是为了清楚起见,反射只会提供有关项目中存在的硬类型的信息,但检查调用堆栈是我需要做的以确定哪种类型代码实际运行了吗?

标签: c# reflection nservicebus


【解决方案1】:

不知道这是否会有所帮助 - 希望会有所帮助。

我需要找到对一段代码的调用的来源 - 一个审计侦听器,以便我们可以记录用于应用更改的组件。我的代码如下:

Assembly currentAssembly = Assembly.GetExecutingAssembly();

string initialAssembly = new StackTrace().GetFrames()
                                         .Where(x => x.GetMethod().ReflectedType != null)
                                         .Select(x => x.GetMethod().ReflectedType.Assembly).Distinct()
                                         .Where(x => x.GetReferencedAssemblies().Any(y => y.FullName == currentAssembly.FullName))
                                         .Last()
                                         .FullName;

【讨论】:

  • 这很有帮助,StackTrace 好像是我想要的,我不知道这个对象