You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:15:07