是否有另一种方法可以根据 C# 中的派生类类型更改抽象类的静态方法的返回类型?

时间:2021-02-10 00:01:36

标签: c# oop

编辑:这个问题的主要目的是为了更深入地了解 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,也许那是不可能的...

1 个答案:

答案 0 :(得分:0)

没有。当您声明一个 static 方法时,它只有一个版本*。调用 ModelBase.Error<ApplicationInit>("") 和调用 ApplicationInit.Error<ApplicationInit>("") 都将编译为完全相同的字节码,一组好的分析器会用警告标记后者。

您可以在 Error 中使用新的静态方法隐藏 ApplicationInit,但这将是每个新子类的手动过程。没有办法^比你已经拥有的更多地概括它。


* 泛型方法可以为不同的类型参数生成不同的字节码,但所有这些方法都是 ModelBase 的静态成员,而不是任何子类。

^ 您可以编写一个源生成器来生成这些静态方法,但这比直接使用泛型 ModelBase.Error<T> 方法要多得多。