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

明示的または暗黙的な演算子

のように明示的にキャストしますが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

NodeAtoの実装を結合することを気にしない場合はNodeB、次のようにコピー コンストラクターを追加します。

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 に答える