名单我有类herichary如下浅复制与向下转换
CEntity ----> CNode ---> CElement
我有一个
class Nodes : List<Cnode>
和
Class Elements : List<Element>
节点类包含在不同项目中共同的公共项目 元素类具有项目特定ic到一个项目。
我得浅拷贝元素列表到节点列表(基本上向下铸造元素节点)
名单我有类herichary如下浅复制与向下转换
CEntity ----> CNode ---> CElement
我有一个
class Nodes : List<Cnode>
和
Class Elements : List<Element>
节点类包含在不同项目中共同的公共项目 元素类具有项目特定ic到一个项目。
我得浅拷贝元素列表到节点列表(基本上向下铸造元素节点)
假设你正在使用.NET 3.0或更高版本,下面的代码创建了相同元素的新列表downcasted到CNodes:
List<CNode> shallowCopyNodesList = elements.Cast<CNode>().ToList();
然后(如果尚未存在),你应该创建一个构造采取在节点类List<CNode>
做:
var shallowCopyNodes = new Nodes(shallowCopyNodesList);
您可以这样做:
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));
逆变仅适用于[interfaces](http://msdn.microsoft.com/en-us/library/dd233059.aspx),而不是具体的类(如List),因此该部分将不起作用。 – R0MANARMY 2010-06-04 12:43:09
@ROMANARMY:实际上它适用于接口和委托类型,但您的观点仍然正确:它不适用于'List
好点!删除 – 2010-06-04 12:49:30
您可以使用Cast运算符LINQ。
var nodelist = elementList.Cast<CNode>()
.ToList();
这不会创建列表的新副本,只是旧集合的枚举。你需要调用'ToList'来使它工作。 – R0MANARMY 2010-06-04 12:44:10
我所做的是
nodes.addrange(ElementList.ConvertAll(new Converter<Elements, CNode>(ConvertElementsToNode))));
和
public static CNode ConvertElementsToNode(Element ele)
{
return ((CNode) ele);
} // ConvertElementsToNode
,但会不会有这种方法的任何性能/内存问题。
我已经完成了nodes.addrange(elements.Cast().ToList()); 它的工作正常。谢谢 –
Mohit
2010-06-07 05:41:36