我可以使用实现该基 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)) {}
我很难表述问题,这也让我很难找到答案。
这是一个模仿我想做的人为设计的场景:
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)) {}