c# - 将具有派生类型的泛型转换为具有父类型的泛型

标签 c# .net generics reflection

我有一个基类:

public abstract class InputParserBase<TInputData> : ServerComponentBase
        where TInputData : SolverDataBase
    {
        public abstract TInputData Parse(ClientInputData task);               
    }

和一个 child :

public class BinomTaskParser : InputParserBase<BinomTaskData>
    {

        public override BinomTaskData Parse(ClientInputData inputData)
        {//Some stuff
        }
    }

BinomTaskData继承自SolverDataBase

我的第二堂课在另一个汇编中,我在运行时加载它。事情是我可以有不同的 child 与另一种类型,派生自 SolverDataBase。我想加载它们并像这样存储:

var result = new List<InputParserBase<SolverDataBase>>();
var parser = (InputParserBase<SolverDataBase>)AssembleyHelper.CreateInstance(typePair, null);
result.Add(parser);

但是得到一个转换异常。我做错了什么,我该如何实现?

最佳答案

类是不变的,因此转换无效。你可以创建一个接口(interface):

public interface IInputParser<out T> where T : SolverDataBase
{
    T Parse(ClientInputData);
}

并在基类或每个子类中实现:

public abstract class InputParserBase<TInputData> : ServerComponentBase, IInputParser<TInputData>
        where TInputData : SolverDataBase
{
    public abstract TInputData Parse(ClientInputData task);
}

然后您可以创建一个列表,例如:

var result = new List<IInputParser<SolverDataBase>>();
var parser = (IInputParser<SolverDataBase>)AssembleyHelper.CreateInstance(typePair, null);
result.Add(parser);

关于c# - 将具有派生类型的泛型转换为具有父类型的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22746388/

相关文章:

c# - 使用 IModelBinder 自定义模型绑定(bind)

c# - 如何将图像和文本插入到 Microsoft Word 模板中?

c# - 转发泛型类型定义

c# - 如何从 Lambda 检索属性的类型并在列表中推断它?

c# - 返回 IEnumerable<> 线程安全吗?

c# - 如何在同一套接字上托管 WCF 服务和 TCP 服务器?

c# - Unity容器配置问题

.NET Dapper 可空转换错误

c# - 显示不超过 6 个月的项目

objective-c - block 中的 Objective C 泛型