编辑:这个问题的主要目的是对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,也许这是不可能的。。。
否。当你声明一个static
方法时,它只有一个版本*。调用ModelBase.Error<ApplicationInit>("")
和调用ApplicationInit.Error<ApplicationInit>("")
都会编译到完全相同的字节码,一组好的分析器会用警告来标记后者。
您可以在ApplicationInit
中使用新的静态方法对Error
进行阴影处理,但对于每个新的子类,这将是一个手动过程。没有比你现有的更能概括它的方法了。
*一个泛型方法可以为不同的类型参数生成不同的字节码,但所有这些方法都是ModelBase
的静态成员,而不是任何子类。
^您可以编写一个源生成器来生成这些静态方法,但这比直接使用通用ModelBase.Error<T>
方法要多得多。