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?
Ich meine, da ist das:
%Vor%Seien Sie vorsichtig bei Abschluss-Semantiken .
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:
und Sie würden es so nennen:
%Vor%und Sie erhalten jedes Mal eine neue Instanz von Thing mit jeweils eigenen Eigenschaftenobjekten.
Sie könnten GimmieAThing
vielleicht in etwas wie GimmieAThing<T>
umschreiben, indem Sie ein bisschen Generika verwenden?
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:
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% Verwenden Sie die Deklaration params
in Ihrer Methode wie folgt:
und Sie können Folgendes tun:
%Vor%Sie können auch ein Array von Objekten und eine for-Schleife verwenden, wenn Sie dies mehrmals tun müssen.
Tags und Links c# arguments parameters syntactic-sugar