1

スキームを仮定すると:

class ComplexProperty
{
    string PropertyName {get; set;}
    string Description {get; set;}
    string GetParentName(); // How can this be implemented?
}

class Parent
{
    string ParentName {get; set;}
    ComplexProperty Property {get; set;}
}

問題は、 内から ParentName を取得することComplexPropertyです。

私が思いついた最善の解決策は、Parent のコンストラクターを使用してプロパティを初期化することですが、これはバグが発生しやすく、別の場所からプロパティを設定すると失敗します。

例えば:

class Parent
{
    public Parent()
    {
       ComplexProperty = new ComplexProperty(this); // Store an instance of the parent inside the property
    }
    string ParentName {get; set;}
    ComplexProperty Property {get; set;}
}

これについてのアイデアはありますか?この種のアーキテクチャのベスト プラクティスはありますか? ComplexPropertyは常に特定のインターフェイス実装の子になるため、リフレクションは実行可能ですが、望ましい解決策ではないことに注意してください。

4

3 に答える 3

1

1 つの方法は、Parentプロパティを保持してComplexPropertyセッターに設定することです。

class ComplexProperty
{
    public string PropertyName {get; set;}
    public string Description {get; set;}
    public IParent Parent {get; set;}
    public string GetParentName() 
    {
        return this.Parent == null ? null : this.Parent.Name;
    }
}

interface IParent
{
    string Name {get; set;}
}
class Parent : IParent
{
   public string ParentName {get; set;}

   private ComplexProperty _prop;
   public ComplexProperty Property 
   {
      get { return _prop; }
      set 
      {
          _prop = value;
          _prop.Parent = this; 
      }
   }
}
于 2012-11-14T10:21:56.793 に答える
0

基本的にこの種の関係を処理するために作成されたEntityFrameworkを使用できます。しかし、それは私が本当に感謝していないオーバーヘッドが付属しています。このフレームワークに関する質問がいくつここにあるかを見てください...

または、独自にコーディングすることもできます。私が作成したモデリングエディタの1つで、コンポーネント/エンティティのセットアップが完了しました。コンポーネントは、空間内の位置を知るために親を知る必要があります。また、コンポーネントは、エンティティを含むシーンを知る必要がある場合もあります。

コンストラクターの使用は1つの方法ですが、親のIDがまだわからない場合があるため、すべてに適用できるとは限りません。

アクセサを使用することもできます。プロパティを変更するときは、受け取ったオブジェクトで「SetParent」のようなものを呼び出します。

また、シリアル化では、階層のシリアル化がやり過ぎだったため、子育てのセットアップを再構築することになりました。上から呼び出され、含まれているすべてのオブジェクトに親を設定し、次にすべての子に同じものを呼び出します。

もちろん、オブジェクトには1つの親しかないと想定する必要があります。コード全体が最初からそのように構築されている場合、管理はそれほど難しくありません。

于 2012-11-14T10:29:58.267 に答える
0

あなたはfuncを使うことができます

class ComplexProperty
{   
    private readonly Func<string> GetParentNameFunc;

    string PropertyName {get; set;}
    string Description {get; set;}
    string GetParentName {get {return GetParentNameFunc(); } }

    public ComplexProperty(Func<string> GetParentNameFunc)
    {
      this.GetParentNameFunc = GetParentNameFunc;
    }
}

class Parent
{
    string Name {get; set;}
    ComplexProperty Property {get; set;}

    //...
    //...

    SomeMethodOrCtor()
    {
      Property = new ComplexProperty(()=>{ return this.Name; });
    }

}
于 2012-11-14T10:23:42.397 に答える