2017-02-23 5 views
0

vereinfacht werden habe ich folgenden sehr repetitiven Code, den ich vereinfachen möchte, aber Kampf wegen der Eigenschaft des NetworkAdapter Objekts, das auf jedem des Event-Handler unterscheidet.Wie kann der folgende Code

Was ist der beste Weg, es zu tun? Im Idealfall sollte dies ohne Lambda-Ausdrücke erreicht werden, wie der Client ich für wenig Verständnis von C# tue dies bin und noch weniger von Lambda und sie würden den Code unterstützen, wenn dies geschehen ist.

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

Wenn es aint brach, repariere es nicht. Warum willst du es vereinfachen? Es gibt nichts Kompliziertes daran, und wenn Ihr Kunde Lambda nicht verstehen kann, werden sie wahrscheinlich nichts anderes verstehen, was Sie damit tun. – DavidG

+0

denn ich habe noch 15-20 Event-Handler, die jetzt von dem exakt gleichen Problem leiden und möchten sie alle vereinfachen. – cogumel0

+0

Ein Wörterbuch mit Delegierten vielleicht? Ein riesiges 'switch' /' case' in einer Methode? Wofür steht Ihr Kunde? – Sinatr

Antwort

2

Erstellen Sie einfach einen einzigen Event-Handler und ändern Sie alle "TextChanged" -Ereignisse, um diesen Handler zu verwenden.

dh:

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(); 
} 

Ein bisschen Reflexion reduziert die Menge an Code, den Sie in Switch-Anweisungen zu schreiben. (Stellen Sie sicher, Sie verwenden System.Reflection) Wenn Sie sehr vorsichtig über die Textbox Namensgebung ich denke, man könnte den ganzen Schalterblock ersetzen mit

propertyName = textBox.Name.Substring(14)

, das die Menge an Code reduzieren würde, aber macht es ziemlich zerbrechlich meine Meinung. Eine bessere Option könnte darin bestehen, jeden Tag Wert auf einen Property der Textbox festlegen, die die Eigenschaft auf der Networkklasse ist es, in einem Konstruktor interessiert sind, und dann beziehen sich nur auf die in der obigen Ereignishandler, um den Eigenschaftswert einzustellen.

dh PropertyInfo pi = ((PropertyInfo)textBox.Tag);

Dann vereinfacht den Code einfach:

//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(); 
} 

Das ist für mich einfach genug aussieht. Wenn Sie sicherstellen wollen, dass jemand anderes es verstehen kann, dann kommentieren Sie einfach jede Zeile, wie oben. Wenn das für sie immer noch zu schwierig ist, würde ich mich fragen, was sie überhaupt tun, um den Code zu unterstützen!

+0

Die 'Tag'-Eigenschaft und Reflektion ist genau das, woran ich bereits gedacht habe (siehe Kommentare in Frage), aber es ist großartig, dass Sie es in eine Antwort setzen. Ich lasse die Frage ein wenig länger offen, ob etwas anderes durchkommt, aber wenn nicht, werde ich deine Antwort als die richtige markieren. – cogumel0

+0

Ich würde jedoch 1 Änderung vornehmen: Ich würde eine Zeichenfolge auf der 'Tag' -Eigenschaft verwenden, so dass es aus dem Editor sichtbar ist und ändern' (PropertyInfo) textbox.Tag; 'zu' typeof (NetworkAdapter) .GetProperty ((string) textbox.Tag) '. – cogumel0

+0

Ah ja du hast! Nun, ich denke, Sie wissen bereits, dass prägnanter (nicht wiederholter) Code in der Regel ein guter Code ist, wie Sie bereits angedeutet haben. Stellen Sie daher sicher, dass es gut kommentiert ist, und fühlen Sie sich bei einer gut ausgeführten Aufgabe sicher. –

Verwandte Themen