【问题标题】:Find out on which type a static method was called找出调用静态方法的类型
【发布时间】:2017-05-23 20:23:25
【问题描述】:

我有一个带有静态方法的类A,以及一个派生类B。您可以在AB 上调用Foo(),在A 中声明:

public class A
{
    public static void Foo() 
    {
       // How to get typeof(B) here if Foo called by using class B? 
    }
}

public class B : A
{
}

...

static class Program
{
    static void Main()
    {
        B.Foo();
    }
}

现在在Foo() 中,我如何知道Foo() 是在哪个类型上调用的?

我不能使用关键字this,因为我没有在这里创建任何对象。我已经试过了:

MethodBase.GetCurrentMethod().DeclaringType 

MethodBase.GetCurrentMethod().ReflectedType 

但他们都给我回了typeof(A),而我需要得到typeof(B)

【问题讨论】:

  • 你试过使用stacktrace吗?
  • 你不能,基本上。
  • @Alfie Goodacre,Stacktrace 看起来像一个“肮脏的把戏”,所以我还没有尝试。
  • @Jon Skeet,谢谢!
  • 堆栈跟踪不会有任何区别,因为尽管问题的措辞如此,这不是关于 caller(即Program.Main),而是关于静态方法调用的目标类。

标签: c# reflection


【解决方案1】:

我不确定你想要达到什么目标,我同意 cmets 的观点,也许你可以用不同的方式来解决这个问题。说到这里,你能用泛型基类做你需要的吗?

public class AB<T>
{
    public static void Foo()
    {
        Console.WriteLine(typeof(T));
    }
}

public class A : AB<A> { }

public class B : AB<B> { }

A.Foo(); // A
B.Foo(); // B

【讨论】:

  • 那么创建一个包装类只是为了指出你想调用哪种类型的静态方法?注意静态方法不能实现接口,所以你不能在你的Foo()中调用T.Foo()
  • 添加类型参数比强制使用泛型类要干净得多。
【解决方案2】:

在这种情况下,无法在静态方法 Foo() 中获取 typeof(B)。可能的解决方案是在 Foo 方法中使用参数。

感谢@Jon Skeet 和@CodeCaster。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多