2016-05-02 2 views
1

J'ai créé une fonction permettant de définir plusieurs propriétés d'un objet à la fois. Si un certain argument n'est pas passé à la fonction, je veux éviter de le modifier/modifier. Un exemple simplifié de la solution la plus propre que je pourrais trouver est la suivante:Passage de null comme paramètre par défaut pour éviter d'utiliser le paramètre

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

Comme vous pouvez le voir dans cette méthode, si la fonction est appelée sans param2 être passé alors il vient de mettre myObject.param2 à lui-même. (ce qui signifie que si rien n'est passé à param2 alors la propriété myObject.param2 est intacte)

Ce que j'ai semble un peu compliqué pour moi. Je ne suis pas sûr que ce soit la bonne chose à faire. J'ai pensé à la surcharge des méthodes, mais je pensais que ce serait encore plus désordonné; Dans la situation du monde réel, je passe plus de deux arguments à définir afin que je puisse finir avec beaucoup de surcharges. Est-ce que je manque une fonctionnalité évidente en C# qui me permet de dire "Ne pas définir ce paramètre si rien n'est passé à son argument correspondant"?

+0

Pourquoi la surcharge de méthode existe-t-elle alors? Je garderais le standard afin que quiconque regarde le code sache ce qui se passe –

+1

@FirstStep S'il y avait 5 propriétés, vous auriez besoin de 32 surcharges pour couvrir tous les cas. – Rob

+0

n'est-ce pas 1 ou 2 ou 3 ou 4 ou 5? @rob –

Répondre

4

Suis-je manque certaines fonctionnalités évidentes en C# qui me permet de dire « Ne définissez pas ce paramètre si rien est passé à son argument correspondant "?

Pas dans un opérateur lisse, mais il est évident que vous pouvez faire

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

La seule différence est que si vous avez une logique dans votre setter il ne sera pas appelé dans ce cas, si le paramètre est nul .

0

le faire comme ceci:

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

Puis:

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

Essayez l'opérateur null-coalescent ??:

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

que vous pouvez invoquer comme

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

AGB a raison - les paramètres nommés sont lisses! – Michael

0

Pour une raison deux idées sont venues à l'esprit quand je lis votre message.

La première idée une sorte de méthode constructeur couramment à la cette annonce: https://stackoverflow.com/a/10046750/2835914

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

Sinon, vous pouvez passer un

dictionary<string,object>()

qui serait alors appliqué conditionnellement en fonction de leur nom à votre objet.

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