2016-05-24 8 views
1

は私が識別子としてのユニークな名前のプロパティを持つレイヤのクラスを持っている:プロパティの型自体と異なる型のプロパティセッターを呼び出すことはできますか?

public class Layer { 
    public string Name { get; set; } 
    ... 
    // Various other properties 
    ... 
} 

さらに私は(他のものの間で)扱うDiagramHandler層管理

public class DiagramHandler { 
    private Layer _activeLayer; 
    public Layer ActiveLayer { 
     get { return _activeLayer; } 
     set { 
      Layer layer = DiagramLayers.FirstOrDefault(l => l.Name.Equals(value.Name); 
      if (layer != null) { 
       _activeLayer = layer; 
      } else { 
       // Error handling 
      } 
     } 
    } 

    public ICollection<Layer> DiagramLayers { get; set; } 
} 

あなたが見ることができるようにする必要があり、私は可能なすべてのレイヤーをハンドラー内のコレクションに格納し、現在アクティブなレイヤーはそれぞれ独自のプロパティーに格納しています。後者が設定されると、コレクション内のレイヤの1つが識別され、アクティブレイヤとして設定されます。さて、レイヤーを適切に識別するために実際にレイヤー名が必要なだけなので、レイヤー全体ではなく、ActiveLayerのセッターに文字列を渡すことができるのだろうかと思います。

// Yes, the DiagramHandler is a singleton 
DiagramHandler.Instance.ActiveLayer = "Background"; 

代わりにこれを実行することの::だから私はこれを行うことができ

DiagramHandler.Instance.ActiveLayer = new Layer() { Name = "Background" }; 

を私はsetter関数を使用することができます知っています(私は実際に今やるいる)が、私は好みます私は知らない言語機能がある場合、またはより洗練された素晴らしいソリューションがある場合は、素朴なプロパティの設定を使用して、好奇心が強いです。

+0

暗黙の演算子を使用すると、文字列からレイヤーオブジェクトへの変換を処理できます。暗黙的な変換を検索します。アイデンティティーとして機能している場合は、レイヤーのNameプロパティを不変にすることもできます。 – Matt

+2

'ActiveLayerName'と呼ばれる2番目の' string'を追加して、それをレイヤー名の取得/設定に使うのはなぜですか? –

答えて

1

いいえ、できません。 Layerクラスに暗黙的な変換オーバーロードを持たせることができます(これはお勧めできません)、または現在の設定方法があります。

あなたの解決策は、残念ながら、隠された構文的な砂糖はありませんが、問題にアプローチする最善の方法です!

2

stringLayerの間にcustom conversion operatorを作成する可能性があります。レイヤーは変更可能なタイプであり、第三者タイプではないと仮定します。

public static explicit operator Layer(string layerName) 
{ 
    return new Layer { Name = layerName }; 
} 

Layer myLayer = (Layer)"Background"; 

implicitキーワードを使用して、明示的なキャストを避けることもできます。

これはあなたの財産の一部だけでなく、グローバルオペレータであることに注意してください。

ローカライズされた別の代替方法がプロパティの代わりに使用される場合は、SetActiveLayerのようなメソッドを使用します。オーバーロードは2つあります.1つはレイヤーを受け取り、もう1つは文字列を受け入れてレイヤーを作成します。

+0

あなたがもっと速くていても、例を挙げても、私はロブの反応を答えとしてマークします。私が現在求めていたものと同じ "良い"アプローチはありませんが、答えに感謝します。非常に感謝しています。 Btw。私は実際に私の記事の最後に書いたように、現在はSetActiveLayerメソッドを使用しています;)レイヤーを引数として取るオーバーロードの必要はありません。 –

+0

心配はいりません。私は彼にも反対した。 :-) –

+0

暗黙の変換の解法は正しいですが、うまくいくでしょうが、ActiveLayerが何であるか、レイヤーなのか、それとも文字列なのかがはっきりしないので、それは悪い設計です。 SetActiveLayer()またはActiveLayerNameは、移動する方法です。それは自己文書化です。 –

関連する問題