C # mehrere Argumente in einem, um die Parameterübergabe auszutrocken

8

Ich weiß nicht, ob das möglich ist, aber in einigen meiner Unit Tests initiiere ich verschiedene Objekte mit den gleichen Argumenten. Ich möchte in der Lage sein, diese Argumente in einer Variablen zu speichern und den Multiparameter-Objektkonstruktor nur mit dieser Variablen zu initialisieren, statt:

%Vor%

Ich könnte Folgendes tun:

%Vor%

Gibt es eine Möglichkeit, dies zu tun, ohne den Konstruktor von Thing zu überschreiben, um eine Liste zu nehmen, die manuell explodiert und Argumente herauspickt? Vielleicht etwas C # syntaktischer Zucker?

    
Sarah Vessels 11.01.2010, 21:08
quelle

7 Antworten

13

Ich meine, da ist das:

%Vor%

Seien Sie vorsichtig bei Abschluss-Semantiken .

    
jason 11.01.2010, 21:10
quelle
3

Nun, ich denke, Sie könnten einen IoC-Container verwenden, da mehrere davon auch eine ObjectFactory bieten, dh Sie sagen dem IoC, wie Sie eine neue Instanz des Typs T erstellen und dann fragen Sie den IoC, Ihnen eine Instanz davon zu geben .

Wenn Sie jedoch keinen IoC bekommen möchten, können Sie sich eine kleine Fabrikklasse machen.

%Vor%

Beachten Sie jedoch, dass alle Ihre Instanzen von Thing Referenzen auf die gleichen Objekte haben, wenn die Argumente nicht vom Typ value sind. Wenn Sie also unterschiedliche Instanzen von Things haben, verweisen alle auf die gleich arg1. Was Sie tun können, um das zu beheben, ist, einen Func in den Parameter aufzunehmen, damit Sie tatsächlich einen neuen erstellen können:

%Vor%

und Sie würden es so nennen:

%Vor%

und Sie erhalten jedes Mal eine neue Instanz von Thing mit jeweils eigenen Eigenschaftenobjekten.

    
Francisco Noriega 11.01.2010 21:52
quelle
1

Es gibt auch das, vorausgesetzt, Ihr Thing1 ist ein triviales Objekt und Sie brauchen nur eine flache Kopie:

%Vor%     
womp 11.01.2010 21:13
quelle
1

Sie könnten GimmieAThing vielleicht in etwas wie GimmieAThing<T> umschreiben, indem Sie ein bisschen Generika verwenden?

%Vor%     
gingerbreadboy 11.01.2010 21:22
quelle
1

Ich würde vorschlagen, dass Sie sich das Muster Testdatengenerator ansehen. Es funktioniert wirklich gut, wenn Sie viele Parameter haben, die Sie unabhängig variieren, wiederverwenden und so weiter.

Sie können Eigenschaften und Objektinitialisierer für "flache" Klassen oder eine flüssige Methodenverkettung als Alternative verwenden. Ich habe mit beiden gespielt und jeder hat seine Vorteile.

Vorteile:

  • Sie können die Variablen / Werte erfassen mit denen ein Objekt erstellt wurde
  • Sie können eine Builder-Instanz erneut verwenden, wenn Die Werte sind einfache Typen und / oder unveränderbar (Werttypen, Strings usw.)
  • Sie können jeden ctor variieren Parameter unabhängig ohne Rauschen / code duplication Erzeugt die Tests lese wirklich gut als, statt sich erinnern müssen, welcher ctor param ist was, du siehst den Namen.

Wenn Sie für jeden Parameter neue Instanzen erstellen müssen, sehen Sie sich die Antwort von bangoker an.

Wie auch immer, hier ist ein Code:

%Vor%

Verwendung (einmal Instanz):

%Vor%

Mehrere Instanzen:

%Vor%     
Mark Simpson 11.01.2010 22:36
quelle
1

Verwenden Sie die Deklaration params in Ihrer Methode wie folgt:

%Vor%

und Sie können Folgendes tun:

%Vor%     
Steve Saxton 26.03.2011 08:13
quelle
0

Sie können auch ein Array von Objekten und eine for-Schleife verwenden, wenn Sie dies mehrmals tun müssen.

    
Hamish Grubijan 11.01.2010 21:18
quelle