2012-01-28 11 views
2

私はこれがはるかに簡単にできると思っていました。オブジェクトグラフを検索

オブジェクトグラフ内の特定のタイプのインスタンスをすべて取得するには、最も効率的な方法が必要です。

私は、このタイプのインスタンスを探してオブジェクトのプロパティを調べるためにリフレクションを使い始めました。その後、他のすべての複雑なタイプとコレクションを続けます。それは、過去にやるべきことを誰かが持っていたはずのものと同様に、多くの仕事のように感じ始めています。だから私は、仕事とテストの負荷に自分自身をコミットする前に、私はフレームワークの中で迅速な勝利を逃しているか、ライブラリのこの種の作業を行うための任意の提言があるかどうか尋ねると思った。

なぜ私はこれをしたいですか? 私は、他のものが派生した型を持っています。このタイプは一般的なプロパティを持ち、より重要なのはエラーを特定する特定のエラーHasErrorsです。このタイプはモデルの構築に使用されます。それぞれのモデルは異なっています。いくつかのシンプルで浅いいくつかの複雑で深い。各複合ノードは、一般的なルールとして、この型から派生するコレクション型またはカスタム型になります。これらのすべてのHasErrorsプロパティをチェックするインスタンスをすばやくトラバースする必要があります。 trueのインスタンスは、モデルにエラーがあることを示します。

Model 
    CustomerId (int) 
    CustomerDetails : MyType 
     Name (string) 
     DoB (DateTime) 
     Addresses (Collection<Address : MyType>) 
      [Line1 (string) 
      Line2 (string)] 

うまくいけば、この種の例です。

+1

自分のタイプですか?あなた自身の複合構造ですか? –

+3

任意のタイプの任意のグラフをトラバースできるようにする場合は、これは作業負荷です(他のものと循環参照を避けることを含む)。ここでの本当の問題は、再定義する方法、タスクを絞り込んで簡単にすることです。 – mfeingold

+0

両方の点に@Martinはい。インスタンスでこの関数を実行する必要がある基本クラスメソッドがあります。それは私が探しているタイプのインスタンスプロパティとそのプロパティです。 – voiddog

答えて

0

あなたのタイプで構成され、全体のオブジェクトグラフをトラバースしたい場合は、それらすべてが、このようなインタフェースを実装作ることができます:

interface IComponent 
{ 
    IEnumerable<IComponent> Components { get; } 
} 

をして、全体のオブジェクトグラフを歩いて、このインターフェイスを使用しています。グラフにサイクルを含めることができる場合は、訪問した頂点のHashSet<IComponent>のようなものを使用して、それを守る必要があります。そのインターフェイスを実装する場合

、反復子ブロックは役に立つかもしれません:

class FamilyMember : IComponent 
{ 
    IEnumerable<IComponent> IComponent.Components 
    { 
     get 
     { 
      if (Father != null) 
       yield return Father; 

      if (Mother != null) 
       yield return Mother; 

      foreach (var child in Children) 
       yield return child; 
     } 
    } 
} 

あなたはすでにこれは退屈かもしれないやって、オブジェクトグラフの一部である種類の多くを持っている場合。そのような場合には、パフォーマンスのペナルティは気にしないでください。リフレクションを使用する方がよいでしょう。

+0

申し訳ありませんがしばらくしていますが、私は答えに感謝したいと思います。私は見て、実際のコードで遊んだと私はあなたが提案しているものを見ることができます。残念ながら私はたくさんの種類があります。私はこれを答えとしてマークするつもりであるので、私はこれを使用することがありますか、私はもっと時間があるときに似たようなものかもしれません。もう一度乾杯。 – voiddog

0

は、この「ボックスの外側を考える」の答えのようなものですが、私はあなたがダウンツリーを検索しなければならないとは思わない、私はあなたがツリーまでエラーにを伝播するべきだと思います。

すべてのオブジェクトに親の参照またはモデルのルートノードのいずれかを指定します。オブジェクトのHasErrorsプロパティがtrueになると、使用した参照の種類に応じて、すべての祖先を介してルートに、またはルートに直接、ツリーの上にメッセージを送信します。

この方法では、モデルにエラーが発生したときに直ちに知っているので、ツリーの複雑で高価で潜在的に無駄なトップダウン検索を実装する必要はありません。

+0

これは当初考えていたことに似ています。基本クラスをすべてのレベルに適用しないので、ルートに直接移動する必要があります。しかし、良い提案です。時間をとっていただきありがとうございます。 – voiddog

関連する問題