Cast/Convert tree structure to different type

c#, casting, data-structures, tree

Solution

A couple approaches...

Copy Constructor

have a NodeA and NodeB contain a constructor which takes the opposite:

class NodeA 
{ 
    public string Name{get;set;} 
    public List<NodeA> Children {get;set;} 

    // COPY CTOR
    public NodeA(NodeB copy)
    {
        this.Name = copy.Name;
        this.Children = new List<NodeA>(copy.Children.Select(b => new NodeA(b));
        //copy other props
    }
} 

Explicit or Implicit Operator

- http://msdn.microsoft.com/en-us/library/xhbhezf4.aspx

- http://msdn.microsoft.com/en-us/library/z5z9kes2.aspx

explicit you would cast like `NodeA a = (NodeA)b;`, while implicit you can skip the parens.

public static explicit operator NodeA(NodeB b)
{
    //if copy ctor is defined you can call one from the other, else
    NodeA a = new NodeA();
    a.Name = b.Name;
    a.Children = new List<NodeA>();

    foreach (NodeB child in b.Children)
    {
        a.Children.Add((NodeA)child);
    }
}

Problem

If I have the class: ``` class NodeA { public string Name{get;set;} public List<NodeA> Children {get;set;} // etc some other properties } ``` and some other class: ``` class NodeB { public string Name; public IEnumerable<NodeB> Children; // etc some other fields; } ``` If I need to convert a NodeB object to of type NodeA what will be the best approach? Create a wrapper class? If I have to create a wrapper class how could I create it so that all the wpf controls will still be able to successfully bind to the properties? Reason why I need to create such cast: There was an old algorithm that was used on a program that return the list of symbols (IMemorySymbol) in a compiled program. We have worked and created a new algorithm and the fields and properties are somewhat different (ISymbolElem). We need to perform a temporary cast in order to display the properties in the view of the wpf application.

Original source