使用派生类型将Generic转换为具有父类型的泛型

时间:2014-03-30 16:17:00

标签: c# .net generics reflection

我有一个基类:

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

和一个孩子:

public class BinomTaskParser : InputParserBase<BinomTaskData>
    {

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

BinomTaskData继承自SolverDataBase

我的第二课是在另一个组合中,我在运行时加载它。事实上,我可以使用从SolverDataBase派生的另一种类型的不同子类。我想加载它们并像这样存储:

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

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

1 个答案:

答案 0 :(得分:2)

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

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);