我有一个基类:
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/