Erstellen Sie einen Ausdruck<U<,>> mit der spiegelung
Im mit Moq erstellen spottet, von einem Daten-set.
Habe ich eine kleine Helfer-Klasse, die es mir erlauben eine in-memory-Speicher anstatt mit einer Datenbank, macht die unit-Tests ein Kinderspiel. Auf diese Weise kann ich Elemente hinzufügen und entfernen von meinem mock-Daten-set, das erlaubt mir, um zu testen, meine insert-und delete-service-Aufrufe.
Während der Installation von mock ich habe eine Zeile, die wie folgt aussieht
this.Setup(i => i.AcademicCycles).Returns(mockStore.GetList<AcademicCycle>());
Mein mock hat eine Menge von Eigenschaften, so möchte ich ausführen dieses setup Schritt mit der spiegelung. Ich habe es geschafft, die Returns
Teil des Prozesses der Arbeit über die Reflexion, sondern ich bin fest auf der lambda-Methode zu Setup
.
Setup
nimmt eine
Expression<Func<GoalsModelUnitOfWork, IQueryable<AcademicCycle>>>
entspricht der i => i.AcademicCycles
und ich möchte dies dynamisch. Mit der spiegelung habe ich Folgendes:
Den Namen der Eigenschaft: "AcademicCycles"
Art IQueryable<AcademicCycle>
Art AcademicCycle
Ich habe auch die Instanz der i
im lambda-Anweisung, die eine GoalsModelUnitOfWork
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den code zum erstellen der Ausdruck dynamisch wäre, wie diese:
Ergebnis wird die gewünschte Art, aber das problem ist, dass der Rückgabetyp der
Expression.Lambda()
istLambdaExpression
und Sie können nicht führen Sie eine Typumwandlung zuExpression<Func<...>>
zu übergeben Sie es als parameter in der setup-Funktion, weil Sie nicht wissen, die generischen Typ-Parameter für dieFunc
. So haben Sie zum aufrufen desSetup
Methode, die von Reflexion, zu:Expression<Func<...>>
wenn Sie statisch kennen die parameter-und Rückgabetypen. Intern Ausdruck.Lambda macht konstruieren eine Instanz der entsprechendenExpression<Func<...>>
geben, auch wenn der Rückgabetyp des Ausdrucks.Lambda ist schwach typisiert.var lambda = Expression.Lambda(parameter, property)
funktionieren sollte (Expression.Lambda wird der Delegat-Typ aus, der Arten und Eigenschaften). Aber mein test code war etwas anders zu verkaufen und verwendet einfachere Arten, so kann Ihre Laufleistung variieren...!Ich beschloss, nehmen einen Riss an es und landete mit diesem Gott schrecklich Stück code.
Ich bin keine Reflexion Experten, und dies ist nur ein Erster Versuch, etwas zu arbeiten. Ich wäre sehr daran interessiert, was andere Ansätze, die Menschen haben, oder ob die relfection wrapper-Bibliotheken können diese schöner.
Diese Methode sollte zu konstruieren, die den lambda-Ausdruck. Da werden Sie den Aufruf der Setup-Methode durch Reflexion, brauchen Sie nicht eine stark typisierte lambda-Ausdruck; Sie gehen, um es zu übergeben, die als Teil einer Objekt-array beim Aufruf
Invoke
:Ich glaube nicht, dass Sie tatsächlich benötigen den parameter-Namen. Wenn ich mich Recht über das, könnten Sie vereinfachen ein wenig: