我可以调用一个驻留在基类上的静态方法,并引用实现该基类的类(在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());

你会得到你想要的

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

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

但在您的场景中,也许您应该简单地声明一个抽象属性(或函数(,用于返回您要查找的值,并在派生类中覆盖它:

基础:

public abstract string MyPropertyName { get; }

衍生:

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

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

基础:

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

衍生:

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

最新更新