2008-11-11 5 views
11

ich eine Klasse haben ReportingComponent<T>, der den Konstruktor hat:erstellen allgemeine Klasse Instanz basierend auf Anonymous Typ

public ReportingComponent(IQueryable<T> query) {} 

Ich habe Linq Abfrage gegen die Datenbank Nordwind,

var query = context.Order_Details.Select(a => new 
{ 
    a.OrderID, 
    a.Product.ProductName, 
    a.Order.OrderDate 
}); 

Abfrage vom Typ IQueryable<a'> , wo ein 'anonymer Typ ist.

Ich möchte Abfrage an ReportingComponent übergeben, um eine neue Instanz zu erstellen.

Was ist der beste Weg, dies zu tun?

Mit freundlichen Grüßen.

Antwort

16

Schreiben Sie eine generische Methode und verwenden Sie Typinferenz. Oft finde ich dies funktioniert gut, wenn Sie eine statische nicht generische Klasse mit dem gleichen Namen wie die Gattungs erstellen:

public static class ReportingComponent 
{ 
    public static ReportingComponent<T> CreateInstance<T> (IQueryable<T> query) 
    { 
    return new ReportingComponent<T>(query); 
    } 
} 

dann in der anderen Code können Sie anrufen:

var report = ReportingComponent.CreateInstance(query); 

EDIT: Der Grund, warum wir brauchen einen nicht-generischen Typ ist, dass Typ Inferenz nur für generische Methoden auftritt - dh eine Methode, die einen neuen Typparameter einführt. Wir können das nicht in den generischen Typ einfügen, da wir den generischen Typ noch angeben müssen, um die Methode aufzurufen, die den ganzen Punkt vereitelt :)

Ich habe eine blog post, die in geht mehr Details.

+0

Beim Versuch zu kompilieren bekomme ich den Fehler: Der Typ oder Namespace-Name 'T' konnte nicht gefunden werden (fehlen Sie eine using-Direktive oder eine Assembly-Referenz?) Scheint es immer noch nicht den Typ von T abzuleiten :( –

+1

Danke Jared Das ist das Problem beim Schreiben von Code auf den Stufen eines Bahnhofs :) –

+0

Eine Frage, warum brauchen wir die nicht-generische Klasse? Warum funktioniert es nicht nur mit der generischen Klasse? Type Inference sollte immer noch funktionieren. –

Verwandte Themen