我有一个方法,它从xml文件中读取元素的类型。此过程在“ AnalyzeNodeLabel()”方法中发生。之后,在此方法中,它们将存储在List中,存储在classObjects之一或interfaceObjects之一中。按类型,应将其添加到列表中。
我的代码:
List<T> getModel<T>(XmlReader reader, List<string> id) where T : BaseObject
{
List<ClassObject> classModels = new List<ClassObject>();
List<InterfaceObject> interfaceModels = new List<InterfaceObject>();
while (reader.Read())
{
if (id != null)
{
foreach (var item in id)
{
var baseModel = AnalyzeNodeLabel<BaseObject>(reader, item);
if (baseModel.GetType() == typeof(ClassObject))
{
classModels.Add((ClassObject)baseModel);
return (T)Convert.ChangeType(classModels,typeof(List<ClassObject>));
}
if (baseModel.GetType() == typeof(InterfaceObject))
{
interfaceModels.Add((InterfaceObject)baseModel);
return (T)Convert.ChangeType(interfaceModels,typeof(List<InterfaceObject>));
}
}
}
}
return null;
}
但是我正在转换问题。在return(T)Convert ...语句处。列表是隐式的,不能转换为列表...
由于协方差,您不能将List<A>
直接转换为List<a>
,其中a:A
(因为typeof(List<A>)
不继承自typeof(List<a>)
。
但是,有一个linq Cast方法。
您无法将List<Child> children
转换为List<Base> bases
原因是,如果编译器允许您安全地执行此操作。这就是为什么
class Base {}
class Child1 : Base {}
class Child2 : Base {}
var children = new List<Child1>();
var bases = (List<Base>)children; // Let's assume this is acceptable
bases.Add(new Child2()); // Now this will add an instance of Child2
// to a List<Child1> which should not be possible
如果仅打算从children
中读取,则可以将其安全地转换为IReadOnlyList<Base>
。这是安全的,因为IReadOnlyList<>
接口不允许修改。 See this for more details。
或者,如果需要基类的列表,则可以使用List<Base>
和List<Child1>
扩展方法从Cast
创建新的Cast
:
ToList