编辑:这个问题的主要目的是为了更深入地了解 C# 和 OOP。请记住,我并不是想用这段代码解决一个特定的问题,而只是想了解一切是如何工作的。
我有办法做到这一点,但我想知道是否还有其他方法可以做到这一点。
public abstract class ModelBase
{
private const string ERROR = "Error";
public string Status { get; set; }
public string StatusDescription { get; set; }
public static T Error<T>(string errorDescription)
where T : ModelBase, new()
{
var model = new T
{
Status = ERROR,
StatusDescription = errorDescription
};
return model;
}
}
然后调用它:
return ModelBase.Error<ApplicationInit>("Failed to retrieve application segment.");
其中“ApplicationInit”是 ModelBase 的派生类。
如果我可以调用:
return ApplicationInit.Error("Failed to retrieve application segment.");
...并且代码将能够仅告诉派生类是什么。
IDK,也许那是不可能的...
答案 0 :(得分:0)
没有。当您声明一个 static
方法时,它只有一个版本*。调用 ModelBase.Error<ApplicationInit>("")
和调用 ApplicationInit.Error<ApplicationInit>("")
都将编译为完全相同的字节码,一组好的分析器会用警告标记后者。
您可以在 Error
中使用新的静态方法隐藏 ApplicationInit
,但这将是每个新子类的手动过程。没有办法^比你已经拥有的更多地概括它。
* 泛型方法可以为不同的类型参数生成不同的字节码,但所有这些方法都是 ModelBase
的静态成员,而不是任何子类。
^ 您可以编写一个源生成器来生成这些静态方法,但这比直接使用泛型 ModelBase.Error<T>
方法要多得多。