2010-06-04 44 views
2

名单我有类herichary如下浅复制与向下转换

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

我有一个

class Nodes : List<Cnode> 

Class Elements : List<Element> 

节点类包含在不同项目中共同的公共项目 元素类具有项目特定ic到一个项目。

我得浅拷贝元素列表到节点列表(基本上向下铸造元素节点)

回答

1

假设你正在使用.NET 3.0或更高版本,下面的代码创建了相同元素的新列表downcasted到CNodes:

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

然后(如果尚未存在),你应该创建一个构造采取在节点类List<CNode>做:

var shallowCopyNodes = new Nodes(shallowCopyNodesList); 
+0

我已经完成了nodes.addrange(elements.Cast ().ToList()); 它的工作正常。谢谢 – Mohit 2010-06-07 05:41:36

1

您可以这样做:

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

其中元素是列表。

您不需要担心退回到CNode,因为CElement会从中继承。重要的是要注意的是,节点列表中的元素(在上例中)实际上是CElement的实例。如果你想CNode你很可能需要使用拷贝构造函数来创建CNode的新实例:

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

并添加CNode的新实例:

nodes.Add(new CNode(element)); 
+1

逆变仅适用于[interfaces](http://msdn.microsoft.com/en-us/library/dd233059.aspx),而不是具体的类(如List),因此该部分将不起作用。 – R0MANARMY 2010-06-04 12:43:09

+0

@ROMANARMY:实际上它适用于接口和委托类型,但您的观点仍然正确:它不适用于'List '。 – 2010-06-04 12:48:28

+0

好点!删除 – 2010-06-04 12:49:30

0

您可以使用Cast运算符LINQ。

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

这不会创建列表的新副本,只是旧集合的枚举。你需要调用'ToList'来使它工作。 – R0MANARMY 2010-06-04 12:44:10

0

我所做的是

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

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

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