C#中能否通过实现基类的子类引用调用基类的静态方法
C# 泛型方法中调用对应类型静态方法解决方案
核心修改方案
你无需改动现有其他代码,只需将TestSpeaker类的Speak<T>方法中注释位置替换为BaseClass<T>.MyPropertyName()即可,修改后的代码如下:
public class TestSpeaker { public void Speak<T>() where T : BaseClass<T> { Console.WriteLine(BaseClass<T>.MyPropertyName()); } }
原理解释
MyPropertyName是定义在BaseClass<T>上的静态方法,C#中静态方法不支持继承多态,直接通过绑定了当前泛型参数的基类调用即可得到对应结果- 当调用
Speak<TestClassA>()时,泛型参数T为TestClassA,此时BaseClass<T>.MyPropertyName()的执行效果和直接调用TestClassA.MyPropertyName()完全一致
运行效果
修改后运行代码,控制台输出将完全符合预期:
Name OtherPropertyName Name OtherPropertyName
可选扩展方案(支持子类自定义返回逻辑)
如果后续需要支持子类重写MyPropertyName的返回值,可以将静态方法改为实例虚方法,调整代码如下:
// 调整基类定义 public abstract class BaseClass<T> { public virtual string MyPropertyName(){ return typeof(T).GetProperties().Single().Name; } } // 调整泛型约束,添加无参构造要求 public class TestSpeaker { public void Speak<T>() where T : BaseClass<T>, new() { Console.WriteLine(new T().MyPropertyName()); } }
该方案需要所有子类支持无参构造,适合需要自定义返回结果的场景。
内容的提问来源于stack exchange,提问作者Brendan McMahon
相关产品推荐
相关产品推荐

