2009-05-07 31 views
0

Ich arbeite an diesem Projekt mvc folgenden Rob Connery Schaufenster Video-Serie und die Techniken anwenden. Auf den Filtern und Erweiterungen Methoden, begann ich mich viel wie zu wiederholen:generische Erweiterungsmethode

diese
public static Sponsor WithID(this IQueryable<Sponsor>qry, int ID) 
{ 
    return qry.SingleOrDefault(s => s.ID== ID); 
} 

public static Keyword WithID(this IQueryable<Keyword>qry,int ID) 
{ 
    return qry.SingleOrDefault(s => s.ID== ID); 
} 
.... 

Um zu verhindern, versuche ich eine generische Erweiterung wie folgt zu schreiben:

public static T WithID<T>(this IQueryable<T>qry,int ID) 
{ 
    return qry.SingleOrDefault(s=>ID==ID); 
} 

jedoch s nicht hat ID, wie würdest du das lösen?

Antwort

5

Sie erhalten eine Schnittstelle benötigen, die eine ID-Eigenschaft erklärt, z.B.

public interface IInt32Identifiable 
{ 
    public int ID { get; } 
} 

Dann können Sie schreiben:

public static T WithID<T>(this IQueryable<T> source, int id) 
    where T : IInt32Identifiable 
{ 
    return source.SingleOrDefault(s=> s.ID == id); 
} 

Natürlich, werden Sie alle entsprechenden Klassen implementieren die Schnittstelle machen müssen - aber das ist in der Regel leicht; Wenn die Klassen vom Designer generiert werden, möchten Sie wahrscheinlich partielle Klassen verwenden.

0

Sie würden zwei verschiedene Erweiterungsmethoden benötigen. Eine für Typen mit einer ID und eine für Typen ohne ID. Sie benötigen außerdem eine Schnittstelle oder abstrakte Basisklasse, die alle ID-Typen implementieren. Andernfalls lässt der Compiler die ID nicht dereferenzieren.

Die einzige andere Alternative, die ich würde erfordern Reflexion denken kann, den Typ für die Eigenschaft ID abfragen, und wenn es vorhanden ist, um den Wert zu bekommen.

Verwandte Themen