我有一个基类:
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);
但是获得一个强制转换异常。我做错了什么,我该如何实现呢?
答案 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);