2017-05-24 3 views
0

Ist es möglich, Typ zu IQueryable zu übergeben, um zur Laufzeit zu realisieren.Übergeben Sie den Typ an IQueryable zur Laufzeit

Wie,

//Get type at runtime 
Type type = Type.GetType("fully qualified class name"); 


IQueryable<type> test = // <-returned object of this type 

Actual Problem wie folgt: Unten Ich bin in der Lage rechte Seite Objekt mit bestimmten Art zu bekommen, aber das wirft nicht auf Art der Abfrage Variablen. Auch ich werde den Typ für die Abfrage kennen.

Später verwenden Sie dieses Abfrageobjekt, um Daten auszuwählen, indem Sie select/wo-Bedingung dynamisch übergeben.

Später muss ich diese Testvariable verwenden, um Daten dynamisch abzufragen.

Bitte schlagen Sie auch eine Alternative zur Lösung dieses Szenarios vor.

+0

Nicht so, nein. Sie können eine generische Methode erstellen, aber nicht ohne Kontext. –

+1

Der Versuch, dies zu tun, weist auf ein größeres Problem mit der Struktur Ihrer Programme hin. Was ist dein ultimatives Ziel? – MrZander

+0

Ich denke, Sie können, aber Ihre Service-Schicht wird sehr kompliziert, weil Sie den Typ mit einem Repository (Tabelle) im laufenden Betrieb zuordnen müssen. Auch die Handhabung der Navigationseigenschaften wird sehr kompliziert. – Sparrow

Antwort

0

Es gibt Möglichkeiten, um zu tun, was Sie über Reflexion fragen, aber Wartbarkeit wird begrenzt sein. Du bist wahrscheinlich besser dran, eine gemeinsame Schnittstelle zu Ihrem Typ zu schaffen und eine generische Methode, so etwas wie diese zu schreiben:

interface IMyInterface 
{ 
    string SomeProperty {get;set;} 
} 

class MyClass : IMyInterface 
{ 
    public string SomeProperty {get;set;} 
} 

IQueryable<T> SomeMethod<T>() where T : IMyInterface, new() 
{ 
    var result = new List<T>() { 
     new T() { SomeProperty = "a"}, 
     new T() { SomeProperty = "b"} 
    }; 
    return result.AsQueryable(); 
} 

So ein Aufruf an die generischen Methode könnte sein:

var temp = SomeMethod<MyClass>(); 
1

Wenn Sie ein Beispiel für den IQueryable Typen, den Sie benötigen, können Sie eine generische Methode verwenden, um die Art zu erfassen - diese gibt einen Null vom richtigen Typ:

public static T NullByExample<T>(this T _) where T : class => (T)null; 

Wenn Sie eine haben Beispiel für die Einzelteile zurück, Sie eine Erweiterung wie verwenden:

public static IEnumerable<T> EmptyByExample<T>(this T _) => Enumerable.Empty<T>(); 

Entweder AsQueryable auf das Ergebnis verwenden:

var test = EmptyByExample(classObject).AsQueryable(); 

oder erstellen Sie eine IQueryable Variante - leider ist es nicht wirklich ein IQueryable Äquivalent zu Enumerable.Empty:

public static IQueryable<T> EmptyQueryByExample<T>(this T _) => Enumerable.Empty<T>().AsQueryable(); 

var test = EmptyQueryByExample(queryObject); 

Ansonsten, wie gesagt, sind Sie in der Welt der refl ection, die wahrscheinlich anzeigt, dass Sie etwas falsch machen. Das Problem ist, dass Sie in diesem Fall nur test vom Typ object erhalten, weil der Compiler nicht wissen kann, was type darstellt und z. var ist eine Kurzschrift zur Kompilierzeit, es sei denn, Sie möchten dynamic verwenden (und Sie sollten das auch nicht tun).

Verwandte Themen