浅层复制带有向下转换的列表

时间:2010-06-04 12:33:32

标签: c# generics downcast

我有以下类的herichary

CEntity ----> CNode ---> CElement

我有一个

class Nodes : List<Cnode>

Class Elements : List<Element>

Node类包含不同项目中共同的公共项 元素类具有特定于项目的项目。

我必须将元素列表浅层复制到节点列表中(基本上将元素向下转换为节点)

4 个答案:

答案 0 :(得分:1)

假设您使用的是.net 3.0或更高版本,以下代码会创建一个新列表,其中SAME元素将下载到CNode:

List<CNode> shallowCopyNodesList =  elements.Cast<CNode>().ToList();

然后(如果还没有)你应该在Nodes类中创建一个List<CNode>的构造函数并执行:

var shallowCopyNodes = new Nodes(shallowCopyNodesList);

答案 1 :(得分:1)

你可以这样做:

List<CNode> nodes = new List<CNode>();
foreach (CElement element in elements) {
  nodes.Add(element);
}

其中元素是List。

您不必担心回退到CNode,因为CElement继承了这一点。需要注意的重要一点是,节点列表中的元素(在上面的示例中)实际上是CElement的实例。如果你想要CNode,你可能需要使用复制构造函数创建一个新的CNode实例:

public CNode(CNode instance)
{
  this.Property = instance.Property;
}

添加一个新的CNode实例:

nodes.Add(new CNode(element));

答案 2 :(得分:0)

您可以在LINQ中使用Cast运算符。

var nodelist = elementList.Cast<CNode>()
                   .ToList();

答案 3 :(得分:0)

我所做的是

nodes.addrange(ElementList.ConvertAll(new Converter<Elements, CNode>(ConvertElementsToNode))));

public static CNode ConvertElementsToNode(Element ele)
    {
      return ((CNode) ele);
    } // ConvertElementsToNode

但这种方法会有任何性能/内存问题。