我很难用短语表达这个问题,这也让我很难找到答案。
这是一个模仿我想做的事情的人为场景:
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)) {}