2016-05-02 14 views
1

zu vermeiden Ich habe eine Funktion erstellt, um mehrere Eigenschaften eines Objekts gleichzeitig festzulegen. Wenn ein bestimmtes Argument nicht an die Funktion übergeben wird, möchte ich es nicht setzen/ändern. Ein vereinfachtes Beispiel für die sauberste Lösung ich tun konnte, ist dies:Null als Standardparameter übergeben, um die Verwendung des Parameters

private void setObjectProperties(MyObject myObject, float param1, bool? param2 = null) 
{ 
    myObject.param1 = param1; 
    myObject.param2 = param2 != null ? (bool)param2 : myObject.param2; 
} 

Wie Sie von dieser Methode sehen, wenn die Funktion aufgerufen wird, ohne param2 dann wird es übergeben wird nur myObject.param2 zu selbst festgelegt. (Das heißt, wenn nichts an param2 weitergegeben wird, dann ist die myObject.param2 Eigenschaft unberührt)

Was ich habe, scheint ein bisschen chaotisch zu mir. Ich bin mir nicht sicher, ob es das "Richtige" ist. Ich habe über Überladung der Methode nachgedacht, aber ich dachte, dass das noch unordentlicher wäre; In der realen Situation übergebe ich mehr als zwei zu setzende Argumente, so dass ich viele Überlastungen bekommen könnte.

Fehle ich einige offensichtliche Funktionalität in C#, die mir erlaubt zu sagen "Setze diesen Parameter nicht, wenn nichts an das entsprechende Argument übergeben wird"?

+0

Warum gibt es dann eine Überladung? Ich würde es Standard beibehalten, so dass jeder, der sich den Code anschaut, weiß, was passiert –

+1

@FirstStep Wenn es fünf Eigenschaften gäbe, müssten Sie 32 Überladungen verwenden, um alle Fälle abzudecken. – Rob

+0

ist es nicht 1 oder 2 oder 3 oder 4 oder 5? @rob –

Antwort

4

Bin ich einige offensichtliche Funktionalität in C# fehlt, die mich „diesen Parameter nicht erlaubt sagen Sie gesetzt, wenn nichts passierte zu seinem entsprechenden Argument "?

nicht in einem glatten Operator, aber natürlich können Sie

tun
if(param2.HasValue) myObject.param2 = (bool)param2; 

Der einzige wirkliche Unterschied ist, wird es in diesem Fall nicht aufgerufen werden, wenn Sie irgendeine Logik in Ihrem Setter haben, wenn der Parameter null ist .

0

es wie folgt tun:

private void setObjectProperties(float? param1 = null, bool? param2 = null) 
{ 
    if (param1.HasValue) { 
     this.param1 = param1.Value; 
    } 
    if (param2.HasValue) { 
     this.param2 = param2.Value; 
    } 
} 

Dann:

MyObject myObject = new MyObject(); 
myObject.setObjectProperties(param1: 1.2f); 
myObject.setObjectProperties(param2: true); 
myObject.setObjectProperties(param1: 1.2f, param2: true); 
2

Versuchen Sie, die Null-Koaleszenz-Operator ??:

private void setObjectProperties(MyObject myObject, float param1, bool? param2 = null, bool? param3 = null) 
{ 
    myObject.param1 = param1; 
    myObject.param2 = param2 ?? myObject.param2; 
    myObject.param3 = param3 ?? myObject.param3; 
} 

, die Sie wie

foo.setObjectProperties(myobj, param1, 
     param2: p2, 
     param3: p3); 
+0

AGB ist richtig - benannte Parameter sind glatt! – Michael

0

Aus irgendeinem Grund zwei Ideen in den Sinn kam aufrufen kann, wenn ich Ihren Beitrag gelesen.

Die erste Idee eine Art fließend Builder Methode a la diesen Beitrag: https://stackoverflow.com/a/10046750/2835914

var result = NinjaBuilder.Build().WithSuperCoolProperties(param1).SoOn().SoForth(); 

Alternativ können Sie ein

dictionary<string,object>()

, die dann bedingt angewendet werden würde passieren basierend auf ihrem Namen zu Ihrem Objekt.

private void setObjectProperties(MyObject myObject, dictionary<string,object> properties) 
{ 
    if(properties.ContainsKey("param2")) 
    { 
     myObject.param2 = properties["param2"]; 
    } 
    //So on down the line 
}