通用列表 如何投射?

问题描述 投票:0回答:2

我有一个方法,它从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 ...语句处。列表是隐式的,不能转换为列表...

c# xml list generics casting
2个回答
1
投票

由于协方差,您不能将List<A>直接转换为List<a>,其中a:A(因为typeof(List<A>)不继承自typeof(List<a>)

但是,有一个linq Cast方法。


0
投票

您无法将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
© www.soinside.com 2019 - 2024. All rights reserved.