4

如果我有课:

class NodeA
{
      public string Name{get;set;}
      public List<NodeA> Children {get;set;}
      // etc some other properties
}

和其他一些类:

class NodeB
{
      public string Name;
      public IEnumerable<NodeB> Children;
      // etc some other fields;
}

如果我需要将 NodeB 对象转换为 NodeA 类型,那么最好的方法是什么?创建一个包装类?如果我必须创建一个包装类,我该如何创建它以便所有 wpf 控件仍然能够成功绑定到属性?

  • 我需要创建这样的演员表的原因:

    在程序中使用了一种旧算法,该算法在已编译的程序中返回符号列表 (IMemorySymbol)。我们已经工作并创建了一个新算法,并且字段和属性有些不同(ISymbolElem)。为了在 wpf 应用程序的视图中显示属性,我们需要执行临时转换。

4

3 回答 3

5

一对夫妇接近...

复制构造函数

有一个 NodeA 和 NodeB 包含一个相反的构造函数:

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
    }
} 

显式或隐式运算符

显式的你会转换 like NodeA a = (NodeA)b;,而隐式的你可以跳过括号。

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);
    }
}
于 2012-08-21T20:42:12.260 回答
1

如果您不关心耦合 to 的实现NodeANodeB则添加一个复制构造函数,如下所示:

class NodeA
{
    public NodeA() { }
    public NodeA(NodeB node)
    {
        Name = node.Name;
        Children = node.Children.Select(n => new NodeA(n)).ToList();
    }

    public string Name{get;set;}
    public List<NodeA> Children {get;set;}
    // etc some other properties
}

如果耦合是一个问题,那么您可以创建一个Convert为您进行转换的 -style 类。请注意,Automapper框架通过对源类型和目标类型使用反射来为您生成这些类型的转换。

于 2012-08-21T20:42:12.053 回答
1

从通用接口继承如何?

interface INode {
  public string Name{get;set;}
  public IEnumerable<INode> Children {get;set;}
}

class NodeA : INode {
  public string Name{get;set;}
  public List<NodeA> Children {get;set;}
  // etc some other properties
}

class NodeB : INode {
  public string Name;
  public IEnumerable<NodeB> Children;
  // etc some other fields;
}

void myMethod() {
  INode nodeB = new NodeB();
  INode nodeA = nodeB;
}
于 2012-08-21T20:57:51.910 回答