C# 泛型和覆盖方法

C# Generic and override methods

我创建了一个 并意识到这是由于我的一些设计错误造成的。但是,我确实认为这个概念很有用,如果可能的话,我想知道如何解决类似的问题。

我想创建一个将 2 个数字相加的算法,无论是 string 还是 int。我还希望能够在控制台中输出所有内容,并希望避免代码重复。我创建了一个根据模型变化的 generic interface。然后是一个 class 来处理两个成员的加法。请注意,数据来自处理程序 classes(在现实生活中,它从外部数据获取信息以填充模型)。

请注意,我知道我知道有更简单的方法来添加它,但我想了解为什么它不起作用。现在,代码不由于 cannot convert from 'T' to 'Test.Models.StringModel',在 ValidateHandler<T>(IAddHandler<T> handler) 中编译。为什么它不能 select 正确的覆盖方法?我尝试将泛型添加到覆盖的方法中,但它仍然不起作用。我怎样才能根据它的类型使 ValidateHandler<T> select 成为正确的方法?

这是我写的代码。

型号:

public class IntegerModel
{
    public int A { get; set; }

    public int B { get; set; }

    public int C { get; set; }
}

public class StringModel
{
    public string A { get; set; }

    public string B { get; set; }

    public string C { get; set; }
}

接口:

public interface IAddHandler<T>
{
    T Add();

    void GetData();
}

处理程序:

public class IntegerHandler : IAddHandler<IntegerModel>
{
    public IntegerModel IntegerModel { get; set; }

    public void GetData()
    {
        // Get Info to Add from external file for example
        IntegerModel = new IntegerModel { A = 10, B = 20 };
    }

    public IntegerModel Add()
    {
        IntegerModel.C = IntegerModel.A + IntegerModel.B;

        return IntegerModel;
    }
 }

public class StringHandler : IAddHandler<StringModel>
{
    public StringModel StringModel { get; set; }

    public void GetData()
    {
        // Get Info to Add from external file for example
        StringModel = new StringModel { A = "10", B = "20" };
    }

    public StringModel Add()
    {
        StringModel.C = StringModel.A + StringModel.B;
        return StringModel;
    }
 }

这是 Main 及其功能

public static void Main(string[] args)
{
    var integerHandler = new IntegerHandler();
    var stringHandler = new StringHandler();

    ValidateHandler(integerHandler);
    ValidateHandler(stringHandler);
}

public static void ValidateHandler<T>(IAddHandler<T> handler)
{
    handler.GetData();
    var result = handler.Add();

    WriteResults(result);
}

public static void WriteResults(StringModel model)
{
    Console.WriteLine(model.C);
}

public static void WriteResults(IntegerModel model)
{
    Console.WriteLine(model.C);
}

我知道我可以执行以下操作,但这样做似乎效果不佳,那时我不明白使用泛型的意义。

public static void ValidateHandler<T>(IAddHandler<T> handler)
{
    handler.GetData();
    var result = handler.Add();

    if (typeof(T) == typeof(StringModel))
    {
        WriteResults(result as StringModel);
    }
    else if (typeof(T) == typeof(IntegerModel))
    {
        WriteResults(result as IntegerModel);
    }
}

我会编写一个使用 object 而不是类型参数的非通用 IModel 接口,并在您的通用 class 中显式实现它。