12

有没有办法通过 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()

@Steve Cooper:我没有考虑过扩展方法。一些变化可能会起作用。

4

5 回答 5

10

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

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

它被称为:

this.StaticExecute();

我想不出一种直接做你想做的事情的方法,但我只能建议,如果你找到了一些东西,你要注意静态方法,它不会有一个,匿名方法,它会有实例自动生成的类,这会有点奇怪。

我确实想知道您是否应该将调用对象作为适当的参数传入。毕竟,statica 暗示了这个方法除了输入参数之外不依赖任何东西。另请注意,此方法可能难以测试,因为您编写的任何测试代码都不会具有与正在运行的系统相同的调用对象。

于 2008-09-18T21:44:04.020 回答
6

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

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

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

于 2008-09-18T21:40:08.647 回答
1

只需让 ExecuteMethod 获取一个对象。然后无论如何你都有实例。

于 2008-09-18T21:38:20.383 回答
1

在静态方法调用您的静态方法的情况下,没有调用实例。

找到一种不同的方式来完成你想做的任何事情。

于 2008-09-18T21:45:56.683 回答
0

我觉得我在这里错过了一些东西。静态方法可以从任何地方调用。不能保证 A 类或 B 类实例会出现在调用堆栈中的任何位置。

必须有更好的方法来完成你想做的任何事情。

于 2008-09-18T21:44:32.863 回答