我可以通过反射/诊断从方法内部获取调用实例吗?

时间:2020-03-06 14:23:36  来源:igfitidea点击:

是否可以通过System.Reflection,System.Diagnostics或者其他方法来获取对调用静态方法的实际实例的引用,而不将其传递给方法本身?

例如,遵循这些原则

class A
{
    public void DoSomething()
    {
        StaticClass.ExecuteMethod();
    }
}

class B
{
    public void DoSomething()
    {
        SomeOtherClass.ExecuteMethod();
    }
}
public class SomeOtherClass
{
    public static void ExecuteMethod()
    {
        // Returns an instance of A if called from class A
        // or an instance of B if called from class B.
        object caller = getCallingInstance();
    }
}

我可以使用System.Diagnostics.StackTrace.GetFrames获取类型,但是有没有办法获取对实际实例的引用?

我知道反射和性能以及从静态到静态的调用存在的问题,并且这通常(甚至几乎是通用的)不是正确的解决方法。这个问题的部分原因是我很好奇它是否可行。我们当前正在传递实例。

ExecuteMethod(instance)

我只是想知道这是否可行,并且仍然能够访问该实例。

ExecuteMethod()

@史蒂夫·库珀:
我没有考虑扩展方法。可能会有一些变化。

解决方案

只需让ExecuteMethod接受一个对象即可。然后,无论如何,我们都有实例。

我不相信你可以。甚至StackTrace和StackFrame类也只为我们提供命名信息,而不提供对实例的访问。

我不确定我们为什么要这样做,但是我知道即使我们可以这样做,也可能会很慢。

更好的解决方案是在调用ExecuteMethod之前将实例推送到线程本地上下文,该方法可以在实例中检索,也可以只传递实例。

考虑使该方法成为扩展方法。将其定义为:

public static StaticExecute(this object instance)
{
    // Reference to 'instance'
}

它被称为:

this.StaticExecute();

我想不出一种直接做自己想做的事情的方法,但是我只能建议如果我们发现了什么,就当心静态方法(该方法没有一个)和匿名方法(该方法将有实例)自动生成的类,这有点奇怪。

我确实想知道我们是否应该仅将调用对象作为适当的参数传入。毕竟,"静态"提示该方法除输入参数外不依赖其他任何内容。还要注意,此方法可能是一个测试难题,因为我们编写的任何测试代码都不会具有与运行系统相同的调用对象。

我觉得我在这里想念什么。静态方法实际上可以在任何地方调用。不能保证A类或者B类实例将出现在调用堆栈中的任何位置。

必须有一种更好的方法来完成我们想做的任何事情。

如果静态方法调用静态方法,则没有调用实例。

寻找一种不同的方式来完成我们想做的事情。