0

Ich teile das nur, weil es mich eine Weile verrückt machte, also, die Frage posten und nur für den Fall jemand beantworten läuft in die gleiche Situation.System.Data.Entity.Core.Objects.ObjectQuery 'enthält keine Definition für' EntitySet '

Ich verwendete Reflexion in einem meiner Projekte, um einen Wert von einem generischen Typ zu erhalten. Das Problem liegt nicht beim generischen Typmethodenaufruf, sondern darin, dass der tatsächliche Rückgabewert selbst ein generischer Typ ist.

Da ich weiß nicht, die generischen Typparameter im Voraus, kann ich nicht Lösungen verwenden wie unten, über das zurückgegebene Objekt:

method = method.MakeGenericMethod(typeof(SomeClass)); 
var result = method.Invoke(service, null); 

Also, was ich tat, war, den dynamischen Typ verwendet wird, und den Eigenschaftsnamen über das zurückgegebene Objekt aufrufen.

var method = octx.GetType().GetMethods().First(x => x.Name == nameof(octx.CreateObjectSet) 
&& x.DeclaringType == typeof(ObjectContext)); 
var generic = method.MakeGenericMethod(type); 
dynamic value = generic.Invoke(octx, null);// => This is the generic typed return value. 
// below, Using dynamic will work, with the pitfal of no compiler checks 
EntitySet set = value.EntitySet; 

Nun, das war perfekt funktioniert gut, bis ich den Code auf eine andere Lösung zu kopieren entschieden, wo ich eine Open-Source-Erweiterungsbibliotheken für Entity Framework bin zu schaffen (EntityExtensions).

Die gleiche Codezeile, die in der vorherigen Lösung funktioniert, funktioniert nicht mehr in der neuen Lösung !!! Es meldet: System.Data.Entity.Core.Objects.ObjectQuery 'enthält keine Definition für' EntitySet '

Was mich verrückt wurde ist, ich bin in der Lage, die tatsächliche Eigenschaft im Debugger anzuzeigen! Eine Eigenschaft mit demselben Namen ist vorhanden, aber es wird einfach eine Ausnahme ausgelöst, dass diese Eigenschaft nicht auf dem dynamischen Objekt vorhanden ist!

Ich schreibe die Antwort als Antwort statt hier nur für die Klarheit.

Antwort

1

Ich brauchte eine ganze Weile, um beide Projekte zu vergleichen und sicherzustellen, dass sie die gleiche .Net-Version verwenden, dieselben Bibliotheken, alles gleich; und sie waren identisch!

Schließlich abgetupft ich die Typdefinition in dem sofortigen Fenster für beide, und fing an, sie zu vergleichen, das ist, als ich bemerkte, dass es ein einziger Unterschied ist:

IsVisible: true 

Das ist ich bekam über den generischen Typparameter denken , also habe ich beide Projekte verglichen, und ... Es stellte sich heraus, dass die neue Projektklasse auf privat gesetzt wurde, während die alte Projektklasse auf public gesetzt wurde.

Das machte Reflektion nicht in der Lage, den richtigen generischen Rückgabetyp zu lesen, während Visual Studio Debugger dazu in der Lage ist.

Also war die Lösung einfach, den Typ von privat zu öffentlich zu ändern (was ich in diesem Fall tun konnte) und alles funktionierte wie ein Zauber.

Ich hoffe, dass dies jemand ein wenig Zeit spart, wenn die gleiche seltsame Situation begegnet.

Verwandte Themen