C# 另一个问题中的stion要简单得多,如果您还没有自己理解我的最后一条评论,我会特别推荐它,因为这意味着您只是在复制您不理解的代码。但如果您喜欢这种方法,它会起作用。非泛型接口方法还允许您的模型类“清洗”不能简单地字符串化的结果:例如,如果结果是列表或枚举,

C# 另一个问题中的stion要简单得多,如果您还没有自己理解我的最后一条评论,我会特别推荐它,因为这意味着您只是在复制您不理解的代码。但如果您喜欢这种方法,它会起作用。非泛型接口方法还允许您的模型类“清洗”不能简单地字符串化的结果:例如,如果结果是列表或枚举,,c#,generics,interface,overriding,C#,Generics,Interface,Overriding,另一个问题中的stion要简单得多,如果您还没有自己理解我的最后一条评论,我会特别推荐它,因为这意味着您只是在复制您不理解的代码。但如果您喜欢这种方法,它会起作用。非泛型接口方法还允许您的模型类“清洗”不能简单地字符串化的结果:例如,如果结果是列表或枚举,非泛型结果重载可以返回String.Join(“,”,result)。但是你也可以在你的通用模型基类中添加一个方法来做同样的事情。我认为这是一个很好的答案,但是--“我相信这比一个完全通用的解决方案更容易理解。”--试图从公共接口IAddHan


另一个问题中的stion要简单得多,如果您还没有自己理解我的最后一条评论,我会特别推荐它,因为这意味着您只是在复制您不理解的代码。但如果您喜欢这种方法,它会起作用。非泛型接口方法还允许您的模型类“清洗”不能简单地字符串化的结果:例如,如果结果是列表或枚举,非泛型结果重载可以返回
String.Join(“,”,result)
。但是你也可以在你的通用模型基类中添加一个方法来做同样的事情。我认为这是一个很好的答案,但是--“我相信这比一个完全通用的解决方案更容易理解。”--试图从
公共接口IAddHandler中破译
公共类IntegerHandler:IAddHandler
,其中T:IModel
公共类模型:IModel
并不明显。(一些评论可能会有所帮助)@BurnsBA OP考虑的解决方案是以某种方式将IAddHandler中的T约束为
Model
——这必须是
IAddHandler,其中T:Model
,因此
类StringHandler:IAddHandler
,对于初学者来说,哪个IMO比非通用的
IModel
接口更麻烦。这对我来说当然更麻烦。这对我来说不是什么大麻烦,但我已经做了一段时间了,OP没有。我认为这是一个很好的答案,但是--“我相信这比一个完全通用的解决方案更容易让你动脑。”--试图从
公共接口IAddHandler中破译
公共类IntegerHandler:IAddHandler
,其中T:IModel
公共类模型:IModel
并不明显。(一些评论可能会有所帮助)@BurnsBA OP考虑的解决方案是以某种方式将IAddHandler中的T约束为
Model
——这必须是
IAddHandler,其中T:Model
,因此
类StringHandler:IAddHandler
,对于初学者来说,哪个IMO比非通用的
IModel
接口更麻烦。这对我来说当然更麻烦。这对我来说不是什么大麻烦,但我已经做了一段时间了,OP没有。
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;
    }
 }
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);
    }
}