2016-05-04 17 views
0

Ich frage mich, ist es möglich, eine Erweiterungsmethode zu erstellen, die mit einer Reihe von verschiedenen Typen funktioniert, vorausgesetzt, sie haben die gleiche Eigenschaft? Zum Beispiel:Generische Erweiterungsmethode für verschiedene Typen mit den gleichen Eigenschaften

public static T GetObjectByIdOrName<T>(this IEnumerable<T> collection, Mapping mapping) where T : IType1, IType2, IType3 
    { 
     return collection.FirstOrDefault(x => x.Id == mapping.ObjectId || x.Name == mapping.ObjectName); 
    } 

Alle Typen haben die ID und die Namen Eigenschaften, so hoffte ich dies möglich wäre - allerdings ist der Compiler mir zu sagen, dass es zwischen Type1.Id und Typ2 Id eine mehrdeutige Referenz ...

Gibt es eine Möglichkeit, dies zu implementieren? (Ich kann keine gemeinsame Basis für sie erstellen)

+1

Sind diese Klassen unter Ihrer Kontrolle? – Colin

+2

Diese Einschränkung bedeutet, dass der Typ alle 3 Schnittstellen implementieren muss. Wenn sie alle dieselben Eigenschaften aufweisen, dann weiß sie nicht, welche Schnittstelle sie durchlaufen soll, falls eine der Eigenschaften explizit implementiert wird. – juharr

+0

können Sie umgestalten, damit jede Schnittstelle eine Basisschnittstelle verwendet? –

Antwort

3

Es ist relativ einfach mit dem richtigen Code-Design. Lass sie einfach eine gemeinsame Schnittstelle teilen.

public interface IBase 
{ 
    object Id{ get; set; } 
    string Name{ get; set; } 
} 

public interface IType1 : IBase{} 
public interface IType2 : IBase{} 

public static T GetObjectByIdOrName<T>(this IEnumerable<T> collection, Mapping mapping) where T : IBase 
{ 
    //... get T.Id or T.Name 
} 

Ansonsten, da es keine gemeinsame Implementierung implizit in der Konstruktion ist, können Sie davon ausgehen, plump die Eigenschaften werden es dynamisch mit.

public static object GetObjectByIdOrName(this IEnumerable collection, Mapping mapping) 
{ 
    return collection.Cast<dynamic>().FirstOrDefault(x => x.Id == mapping.ObjectId || x.Name == mapping.ObjectName); 
} 
+0

'IType1' und' IType2' kommen von einem externen Projekt –

+1

Ich frage mich, warum der Downvote ... Ich mag den dynamischen Ansatz – Bartosz

+0

@SamIam - Richtig, aber er hat nicht klar, dass bis ich die Antwort geschrieben habe und ich zur Verfügung gestellt eine Alternative, falls er die Schnittstellen nicht kontrollieren konnte. – Colin

Verwandte Themen