有没有其他方法可以根据C#中的派生类类型更改抽象类的静态方法的返回类型



编辑:这个问题的主要目的是对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>方法要多得多。

最新更新