Ich Herumalbern mit einer kleinen SQL-Bibliothek mit einer fließend API erstellen und will, so etwas tun:C# Fluent API Mit Dynamic Func <> Ausbau
var person = connection.GetOne<Person>("select * from [Person] where [Id] = 1")
.WithMany<Pet>("select * from [Pet] where [PersonId] = 1")
.WithMany<Address>("select * from [Address] where [PersonId] = 1]")
.Build((person, pets, addresses) =>
{
person.Pets = pets;
person.Addresses = addresses;
return person;
});
Ich baue viel habe die fließend API vor, aber alle waren viel einfacher und nicht so stark auf Generika angewiesen. Meine Frage ist speziell, wie man die Endfunktion Build() implementiert. Ich bin mir nicht sicher, ob es überhaupt möglich ist (scheint nicht so, aber vielleicht ist Expression der Schlüssel?), Aber wie kann ich die generischen Typen verfolgen, die in den Aufrufen der höheren Kettenmethoden angegeben sind (zB GetOne <> (), WithMany <>()), so dass, wenn die .Build() aufgerufen wird die Func <> die benötigt wird, ist der richtige Typ?
In dem obigen Beispiel ich die Func < wollen würde> Func < Person, IEnumerable <Pet>, IEnumerable <Adresse> > so dass der Entwickler das Stammelement konstruieren kann sein (Person) in welcher Weise auch immer sie brauchen - In diesem Fall füllen Sie einige Sammlungen mit den Ergebnissen von ein -> vielen Abfragen.
Gibt es eine Möglichkeit, dies zu tun oder bin ich kein Glück? Es scheint wie eine Menge Orte, die ich geschaut habe ähnliche Dinge tun, die ganzen:
Func<In1, TResult>
Func<In1, In2, TResult>
Func<In1, In2, In3, TResult>
...etc, etc
... Art der Sache, die Sie zu einer maximalen Anzahl von Parametern für die Funktion offensichtlich begrenzt.
Jede Hilfe oder Hinweise würden sehr geschätzt werden.
schauen Sie, wie LINQ implementiert IEnumerable.Select https://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,bc79a642e00b8681 – pm100