C# 将派生类型的泛型强制转换为父类型的泛型

C# 将派生类型的泛型强制转换为父类型的泛型,c#,.net,generics,reflection,C#,.net,Generics,Reflection,我有一个基本类: public abstract class InputParserBase<TInputData> : ServerComponentBase where TInputData : SolverDataBase { public abstract TInputData Parse(ClientInputData task); } 公共抽象类InputParserBase:ServerCo

我有一个基本类:

public abstract class InputParserBase<TInputData> : ServerComponentBase
        where TInputData : SolverDataBase
    {
        public abstract TInputData Parse(ClientInputData task);               
    }
公共抽象类InputParserBase:ServerComponentBase 其中TInputData:SolverDataBase { 公共抽象TInputData解析(ClientInputData任务); } 还有一个孩子:

public class BinomTaskParser : InputParserBase<BinomTaskData>
    {

        public override BinomTaskData Parse(ClientInputData inputData)
        {//Some stuff
        }
    }
公共类BinomTaskParser:InputParserBase
{
公共重写BinomTaskData解析(ClientInputData inputData)
{//一些东西
}
}
BinomTaskData是从SolverDataBase继承的

我的第二个类在另一个assembley中,我在运行时加载它。问题是,我可以有不同类型的子对象,它们来自SolverDataBase。我想加载它们并按如下方式存储:

var result = new List<InputParserBase<SolverDataBase>>();
var parser = (InputParserBase<SolverDataBase>)AssembleyHelper.CreateInstance(typePair, null);
result.Add(parser);
var result=newlist();
var parser=(InputParserBase)AssembleyHelper.CreateInstance(类型对,null);
添加(解析器);

但是得到一个cast异常。我做错了什么?如何实现这一点?

类是不变的,因此强制转换无效。您可以创建一个接口:

public interface IInputParser<out T> where T : SolverDataBase
{
    T Parse(ClientInputData);
}
公共接口IIInputParser,其中T:SolverDataBase
{
T解析(ClientInputData);
}
并在基类或每个子类中实现:

public abstract class InputParserBase<TInputData> : ServerComponentBase, IInputParser<TInputData>
        where TInputData : SolverDataBase
{
    public abstract TInputData Parse(ClientInputData task);
}
公共抽象类InputParserBase:ServerComponentBase,IIInputParser 其中TInputData:SolverDataBase { 公共抽象TInputData解析(ClientInputData任务); } 然后,您可以创建如下列表:

var result = new List<IInputParser<SolverDataBase>>();
var parser = (IInputParser<SolverDataBase>)AssembleyHelper.CreateInstance(typePair, null);
result.Add(parser);
var result=newlist();
var parser=(IInputParser)AssembleyHelper.CreateInstance(类型对,null);
添加(解析器);

Hmm,我想我得到了协方差的魔力,但据我所知,这只适用于返回类型。那么方法参数呢?我如何使ClientInputData也成为泛型类型,然后生成一个列表?我无法工作,我在c#中使用了co和CONTRAVANCE,并且了解它是如何工作的。但问题是,我还需要参数的协方差,而且,据我所知,我不能欺骗编译器。有什么办法可以使我的解析方法的参数也协变吗?