hi dies ist meine Methode, die als Teil einer generischen Entity-Framework-Repository-Klasse existiert.So rufen Sie eine Methode auf, die linq-Ausdruckargumente akzeptiert
Ich muss die Methode über Reflexion aufrufen und das ist, was ich bisher getan habe.
using (var ctx = (DbContext)Activator.CreateInstance(dbContextType))
{
ctx.Configuration.LazyLoadingEnabled = false;
var curEntityPI = ctx.GetType().GetProperties().Where(pr => pr.Name == "Worker").First();
var curEntityType = curEntityPI.PropertyType.GetGenericArguments().First();
var set = ctx.Set(curEntityType);
Type generic = typeof(DataAccess.Repository.EF.dEfDataRepository<,>);
Type[] typeArgs = {curEntityType, dbContextType};
Type constructed = generic.MakeGenericType(typeArgs);
MethodInfo methodInfo = constructed.GetMethod("GetAll");
object repositoryInstance = Activator.CreateInstance(constructed, new object[] { ctx });
var result = methodInfo.Invoke(repositoryInstance,new object[] { });
}
Ich weiß, ich brauche die Parameter-Array in MethodInfo.Invoke zu ändern, aber für Testzwecke sagen, es ist nur ein leeres Linq Ausdruck oder das Äquivalent davon war, wenn statisch genannt ..
WorkerRepository workerRepositoryInstance = new
WorkerRepository<Worker,MyDbContext>(ctx);
List<Worker> workers = workerRepositoryInstance.GetAll().ToList();
Wie würde ich den richtigen Parameter in methodInfo.Invoke() liefern
Ich mache dies, weil ich mit einem dbcontext und Entities arbeiten müssen, die in einer externen DLL sind und keine Referenz zu diesem in meinem Anwendungsprojekt hinzufügen können . Meine Anwendung muss in der Lage sein, die "Satelliten" -Assembly so zu referenzieren, dass verschiedene Implementierungen der Anwendung auf verschiedene Versionen der Data-Provider-DLL zugreifen können.
Vielen Dank für Ihre Hilfe.
Verwenden Sie die 'Expression *()' Methoden einen Ausdrucksbaum zu bauen. – SLaks
Was ist die eigentliche Frage? Um eine Ausnahme in dem, was Sie bisher gemacht haben, zu vermeiden? –
Für jetzt ja, das neue Objekt [] {} erstellt eine Ausnahme, also möchte ich nur so weit durch Reflexion gehen wie der äquivalente statische Code im letzten Block (vorausgesetzt, ich habe es korrekt eingegeben, da ich tatsächlich meine Repositories instanziiert habe) anderswo etwas anders durch DI), dh einige Ergebnisse bekommen. Darüber hinaus würde ich gerne verstehen, wie ich diese Methode mit einem Beispielausdruck aufrufen würde, da ich nicht viel mit Reflektion getan habe oder Linq und Generika auch nicht kombiniere. Dafür werde ich keinen direkten Zugriff auf alle Typen in den Assembly-Only-Entity-Namen, d. H. "Worker" –