2017-02-23 18 views
0

私は単純化したいが、それぞれのイベントハンドラで異なるNetworkAdapterオブジェクトのプロパティのために苦労している以下の非常に反復的なコードを持っています。次のコードはどのように簡略化できますか

どのような方法が最適ですか?理想的には、これはラムダ式なしで達成する必要があります。これを行うクライアントはC#の知識がほとんどなく、ラムダの量も少なく、コードが実行されたときにコードをサポートします。

private void textBoxNetworkSubnetMask_TextChanged(object sender, EventArgs e) 
{ 
    IPAddress.TryParse(textBoxNetworkSubnetMask.Text, out var ipAddress); 

    ((NetworkAdapter)comboBoxNetworkCard.SelectedItem).SubnetMask = ipAddress; 

    wizardPageNetworkDetails.AllowNext = ValidateNetworkDetailsPage(); 
} 

private void textBoxNetworkGateway_TextChanged(object sender, EventArgs e) 
{ 
    IPAddress.TryParse(textBoxNetworkGateway.Text, out var ipAddress); 

    ((NetworkAdapter)comboBoxNetworkCard.SelectedItem).Gateway = ipAddress; 

    wizardPageNetworkDetails.AllowNext = ValidateNetworkDetailsPage(); 
} 

private void textBoxNetworkPrimaryDns_TextChanged(object sender, EventArgs e) 
{ 
    IPAddress.TryParse(textBoxNetworkPrimaryDns.Text, out var ipAddress); 

    ((NetworkAdapter)comboBoxNetworkCard.SelectedItem).PrimaryDns = ipAddress; 

    wizardPageNetworkDetails.AllowNext = ValidateNetworkDetailsPage(); 
} 
+2

壊れていない場合は、修正しないでください。なぜそれを簡素化したいのですか?それについては何も複雑なことはありません。クライアントがラムダを理解できない場合は、他のことを理解することはまずありません。 – DavidG

+0

'私はまったく同じ問題を抱えている15-20個のイベントハンドラがあり、それらをすべて簡素化したいからです。 – cogumel0

+0

代理人の辞書はおそらく? 1つの方法で巨大な 'switch' /' case '?あなたのクライアントは何ですか? – Sinatr

答えて

2

単一のイベントハンドラを作成し、すべての "TextChanged"イベントを変更してそのハンドラを使用するだけです。

すなわち:反射の

private void textBoxIPField_TextChanged(object sender, EventArgs e) 
{ 
    var textBox = (Textbox)sender; 
    IPAddress.TryParse(textBox.Text, out var ipAddress); 

    string propertyName = ""; 
    switch(textBox.Name) 
    { 
     case textboxNetworkSubnetMask: 
      propertyName = "SubnetMask"; 
      break; 
     case textboxNetworkGateway: 
      propertyName = "Gateway"; 
      break; 
     case textboxNetworkPrimaryDns: 
      propertyName = "PrimaryDns"; 
      break; 
    } 
    PropertyInfo pi = typeof(NetworkAdapter).GetProperty(propertyName); 
    pi.SetValue((NetworkAdapter)comboBoxNetworkCard.SelectedItem, ipAddress); 

    wizardPageNetworkDetails.AllowNext = ValidateNetworkDetailsPage(); 
} 

ビットを使用すると、switch文で記述する必要がコードの量を減らします。あなたはテキストボックスの命名については非常に慎重にしている場合(あなたがSystem.Reflectionを使用していることを確認してください)私はあなたが

コードの量を減らす、しかし、それはかなり脆くなり

propertyName = textBox.Name.Substring(14)

と全体のスイッチブロックを置き換えることができると思います私の意見。より良いオプションは、各テキストボックスのTagの値を、コンストラクタ内で興味のあるNetworkAdapterクラスのプロパティであるPropertyInfoに設定し、次にプロパティの値を設定するために上記のイベントハンドラの値を参照することです。 PropertyInfo pi = ((PropertyInfo)textBox.Tag);

すなわち

は、その後のコードでは、ちょうど簡単になります。私には十分に単純に見える

//constructor 
public MyFormClass() 
{ 
    InitializeComponent(); 

    //each textbox has a Tag set to the property of a NetworkAdapter that it refers to 
    textboxNetworkSubnetMask.Tag = "SubnetMask"; 
    textboxNetworkGateway.Tag = "Gateway"; 
    textboxNetworkPrimaryDns.Tag = "PrimaryDns"; 
} 
.... 

private void textBoxIPField_TextChanged(object sender, EventArgs e) 
{ 
    // (1) determine which textbox we are referring to... 
    var textBox = (Textbox)sender; 

    // (2) get the IP address that was entered in the textbox 
    IPAddress.TryParse(textBox.Text, out var ipAddress); 

    // (3) Get the Property of a Network adapter that needs changing. 
    // The name of this property was stored in the textbox's Tag in construction. 
    PropertyInfo pi = typeof(NetworkAdapter).GetProperty((string)textbox.Tag); 

    // (4) Set the new value for that property for the selected NetworkAdapter 
    pi.SetValue((NetworkAdapter)comboBoxNetworkCard.SelectedItem, ipAddress); 

    wizardPageNetworkDetails.AllowNext = ValidateNetworkDetailsPage(); 
} 

を。他の誰かがそれを理解できるようにしたいのであれば、上記のようにすべての行にコメントするだけです。それでもまだ難しいのであれば、最初にコードをサポートしているビジネスは何か疑問に思っています。

+0

'Tag'プロパティとリフレクションを使っているのは、私がすでに考えていたものです(問題のコメントを見てください)が、それを答えに入れるのは素晴らしいことです。私は質問をもう少し開いたままにしておきます。何か他のものが来るかどうかを見てください。そうでなければ、私はあなたの答えを正しいものにします。 – cogumel0

+0

私は1つの変更を行いたいと思います: 'Tag'プロパティで文字列を使用して、エディタから表示され、'(PropertyInfo)textbox.Tag;を 'typeof(NetworkAdapter).GetProperty((string)テキストボックス.Tag) '。 – cogumel0

+0

ああありがとう!さて、あなたはすでに、これを示唆しているように、簡潔な(反復されない)コードは通常は良いコードであることを既に知っていると思います。したがって、よくコメントされていることを確認し、うまくいった仕事で安全を感じてください。 –

関連する問題