代码之家  ›  专栏  ›  技术社区  ›  Scott Nichols

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

  •  10
  • Scott Nichols  · 技术社区  · 16 年前

    是否有方法通过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: 我没有考虑过扩展方法。有些变化可能会奏效。

    5 回复  |  直到 16 年前
        1
  •  5
  •   Aaron Jensen    16 年前

    我不相信你能。甚至stacktrace和stackframe类也只提供命名信息,而不提供对实例的访问。

    我不知道你为什么要这样做,但我知道即使你能这样做,它也可能非常慢。

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

        2
  •  9
  •   Peter Mortensen icecrime    11 年前

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

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

    它被称为:

    this.StaticExecute();
    

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

    我想知道您是否应该将调用对象作为适当的参数传入。毕竟,A static 提示此方法不依赖于其输入参数以外的任何内容。另外请注意,这个方法可能是一个需要测试的婊子,因为您编写的任何测试代码都不会具有与运行系统相同的调用对象。

        3
  •  1
  •   therealhoff    16 年前

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

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

        4
  •  1
  •   Peter Mortensen icecrime    11 年前

    让executeMethod获取一个对象。那么,不管发生什么,您都有这个实例。

        5
  •  0
  •   Mark Bessey    16 年前

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

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

    推荐文章