2012-01-06 10 views
0

私のコードでは、少なくとも次のコードを10回以上持っています。私には匂いのようです。ジェネリック医薬品は使用できますか?

 public void DisplayTransitInfo(TransitInfo transitInfo) 
    { 
     if (InvokeRequired) 
      EndInvoke(BeginInvoke(new MethodInvoker(() => DisplayTransitInfo(transitInfo)))); 
     else 
     { 
      var control = (from string key in _visiblePanes.Keys 
          where key == "transitInfo" 
          select _visiblePanes[key].Control).ToList(); 

      TransitInfoControl cntl = (TransitInfoControl)control[0]; 
      //TODO: Transit Info 
     } 
    } 

    public void ModifyParties(UltraTreeNode node) 
    { 
     if (InvokeRequired) 
      EndInvoke(BeginInvoke(new MethodInvoker(() => ModifyParties(node)))); 
     else 
     { 
      var control = (from string key in _visiblePanes.Keys 
          where key == "parties" 
          select _visiblePanes[key].Control).ToList(); 

      PartiesControl cntl = (PartiesControl)control[0]; 
      cntl.ModifyParties(node); 
     } 
    } 

このような状況でジェネリック医薬品を使用することは可能かもしれません。私はまた、移動を考慮した:

   var control = (from string key in _visiblePanes.Keys 
          where key == "parties" 
          select _visiblePanes[key].Control).ToList(); 

辞書のコントロールのインスタンスを返す独自の関数です。

このコードは匂いがするのですか、それとも私の鼻を鍛える必要がありますか?

いつものように!

答えて

3

あなたは

 var control = (from string key in _visiblePanes.Keys 
         where key == "transitInfo" 
         select _visiblePanes[key].Control).ToList(); 

     TransitInfoControl cntl = (TransitInfoControl)control[0]; 

 var control = (from string key in _visiblePanes.Keys 
         where key == "parties" 
         select _visiblePanes[key].Control).ToList(); 

     PartiesControl cntl = (PartiesControl)control[0]; 

を簡素化するために探していると_visiblePanesが、それは何の重複キーを持つことはできません意味辞書であれば、あなたはただ、ジェネリック医薬品を必要としない場合代わりにこれを使用する:

var cntl = (TransitInfoControl)_visiblePanes["transitInfo"].Control; 

var cntl = (PartiesControl)_visiblePanes["parties"].Control; 

EDIT

ジムMischelのと比較して、この提案は、入力して読み出すことであるだけでなく、簡単、それにも近い(元のコードと同値のために上記添加キャスト)キーがディクショナリに存在しない場合は例外をスローするため、元のコードです。元のコードでLinqを使用してその可能性をカバーしようとすると、PartiesControl cntl = (PartiesControl)control[0];に失敗します。辞書にキーが存在しないことが例外ではないと仮定すると、もちろん、JimのTryGetValueソリューションが優れています。ジェネリック医薬品についての元の質問に戻るには

は、は、一般的な方法に投げ込ま取得-とロジックを抽出することで可能という利点がある。

bool TryGetCast<T>(IDictionary<string, BaseControl> dict, string key, out T value) where T : BaseControl 
{ 
    BaseControl tryGet; 
    if (dict.TryGetValue(key, out tryGet) 
    { 
     value = (T)tryGet; 
     return true; 
    } 
    value = default(T); 
    return false; 
} 

は、このように呼び出すことができます。

PartiesControl cntl; 
if (TryGetCast(_visiblePanes, "parties", out cntl)) 
{ 
    //do whatever; 
} 

ただし、利益はわずかです。私は何かが欠けすることができる

BaseControl c; 
if (_visiblePanes.TryGetValue("parties", out c)) 
{ 
    var cntl = (PartiesControl)c; 
    // do whatever 
} 
3

アプリケーションで同じコードが10回ある場合は、の間違いなくリファクタリングする時間はです!

あなただけ_visiblePanes["parties"]を使用する(またはキーが存在するかどうかわからない場合TryGetValueを使用する)ことができたときに

(from string key in _visiblePanes.Keys 
         where key == "parties" 
         select _visiblePanes[key].Control) 

を書くのはなぜ?

controlはなぜリストに登録されていますか? controlは、コレクションの名前のようには聞こえません。

+0

はい、他にこのコードを独自のオブジェクトにカプセル化していない場合は、そうです。 –

2

、あなたがそこに全体のLINQ式を取り除くことができます私には思える:Jimのソリューションに加え、キャストは、はるかに冗長ではありません。つまり、このコードです:

var control = (from string key in _visiblePanes.Keys 
       where key == "parties" 
       select _visiblePanes[key].Control).ToList(); 
PartiesControl cntl = (PartiesControl)control[0]; 

私は右、あなたがキー「パーティー」を持っているすべての項目を見つけるために、キー付きコレクションを列挙していることを読んでいた場合。しかし、あなたは_visiblePanes[key].Controlと書いているので、そのうちの1つしかないようです。私は_visiblePanesDictionary<string, BaseControl>であると仮定します。ここでBaseControlはどのクラスでもPartiesControlで、他のコントロールタイプは継承しています。

BaseControl cntl; 
if (_visiblePanes.TryGetValue("parties", out cntl)) 
{ 
    PartiesControl pcntl = cntl as PartiesControl; 
    // do whatever 
} 
+0

'PartiesControl'を' IDictionary .TryGetValue'に渡すことはできません。変数の型は 'BaseControl'でなければなりません。したがって、サブクラスのメンバーにアクセスするためにキャストを追加する必要があります。 – phoog

+0

@phoog:良いキャッチ。修正されました。 –

関連する問題