题
有没有办法通过 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();
}
}
我可以使用获取类型 系统.诊断.StackTrace.GetFrames, ,但是有没有办法获得对实际实例的引用?
我知道反射和性能以及静态到静态调用的问题,并且这通常(甚至可能几乎普遍)不是解决此问题的正确方法。这个问题的部分原因是我很好奇这是否可行;我们目前正在传递实例。
ExecuteMethod(instance)
我只是想知道这是否可能并且仍然能够访问该实例。
ExecuteMethod()
@史蒂夫库珀:我没有考虑过扩展方法。一些变化可能会起作用。
解决方案
我不相信你可以。即使 StackTrace 和 StackFrame 类也只是为您提供命名信息,而不是对实例的访问。
我不确定你为什么要这样做,但要知道即使你能做到,它也可能会非常慢。
更好的解决方案是在调用 ExecuteMethod 之前将实例推送到线程本地上下文,您可以在其中检索该实例或仅传递该实例。
其他提示
考虑使该方法成为扩展方法。将其定义为:
public static StaticExecute(this object instance)
{
// Reference to 'instance'
}
它被称为:
this.StaticExecute();
我想不出一种方法来直接做你想做的事情,但我只能建议,如果你找到一些东西,你要注意静态方法,它不会有一个实例,而匿名方法会有实例自动生成的类,这会有点奇怪。
我确实想知道您是否应该将调用对象作为适当的参数传递。毕竟,一个 static
暗示此方法不依赖于其输入参数以外的任何内容。另请注意,此方法可能很难测试,因为您编写的任何测试代码都不会具有与正在运行的系统相同的调用对象。
在静态方法调用静态方法的情况下,没有调用实例。
找到一种不同的方式来完成你想做的事情。
只需让 ExecuteMethod 获取一个对象即可。然后无论如何你都有实例。
我觉得我在这里错过了一些东西。静态方法实际上可以从任何地方调用。无法保证 A 类或 B 类实例将出现在调用堆栈中的任何位置。
一定有更好的方法来完成您想做的任何事情。