我可以使用实现该基 class 的 class 的引用调用基于基 class 的静态方法(在 C# 中)吗?

Can I call a static method that lives on a base class with a reference the the class implementing that base class (in C#)?

我很难表述问题,这也让我很难找到答案。

这是一个模仿我想做的人为设计的场景:

void Main()
{
    Console.WriteLine(TestClassA.MyPropertyName());
    Console.WriteLine(TestClassB.MyPropertyName());
    
    var speaker = new TestSpeaker();
    speaker.Speak<TestClassA>();
    speaker.Speak<TestClassB>();
}

public class TestSpeaker {
    public void Speak<T>() where T : BaseClass<T> {
        Console.WriteLine(/* I want to call T.MyPropertyName() here */);
    }
}

public class TestClassA : BaseClass<TestClassA> {
    public string Name { get; set; }
}

public class TestClassB : BaseClass<TestClassB> {
    public string OtherPropertyName { get; set; }
    
}

public abstract class BaseClass<T> {

    public static string MyPropertyName(){
        return typeof(T).GetProperties().Single().Name;
    }
}

控制台现在会显示:

Name
OtherPropertyName

我想替换我注释掉的代码,这样它会显示为:

Name
OtherPropertyName
Name
OtherPropertyName

如果您将 Writeline 更改为

Console.WriteLine(BaseClass<T>.MyPropertyName());

你会得到你想要的

为什么要在基 class 中使用静态函数来检索有关派生 class 的信息?在任何情况下,您都可以实现一个成员函数来包装静态调用:

public static string MyStaticFunction() => return "whatever";

public string MyMemberFunction() => MyStaticFunction();

但在您的场景中,也许您应该简单地声明一个抽象 属性(或函数),意味着 return 您正在寻找的值并在派生 class 中覆盖它es:

基地:

public abstract string MyPropertyName { get; }

派生:

public override string MyPropertyName => nameof(OtherPropertyName); // or more complex logic

另一种可能的解决方案是将信息作为字符串(或 属性 表达式,如果您愿意的话)传递给基础 class 的构造函数:

基地:

public string MyPropertyName { get; init; }

public BaseClass(string propertyName)
{
    MyPropertyName = propertyName; // maybe validate that the property exists
}

派生:

public MyTestClassB() : BaseClass(nameof(OtherPropertyName)) {}