2015-06-03 4 views
7

Ich verwende den folgenden Code. Es ist für eine bestimmte Art entwickelt, um es zu begrenzen, ist Pop-up-ness in intellisense usw.Erweiterungsmethode für genau zwei verschiedene Typen

public static Generic Get<Generic>(this Entity input) 
{ 
    return (Generic)input; 
} 

Nun möchte Ich mag die gleichen Get Verfahren für eine andere Art verwenden (oder vollständig abgedeckt werden, ein paar anderen Arten aber immer noch eine feste Anzahl von). Also habe ich eine zweite Methode hinzugefügt und der Code sieht folgendermaßen aus.

public static Generic Get<Generic>(this Entity input) 
{ 
    return (Generic)input; 
} 

public static Generic Get<Generic>(this Entity2 input) 
{ 
    return (Generic)input; 
} 

Es scheint mir, dass ein besserer Ansatz es in dem gleichen Methode Körper zu halten wäre und noch alle angesehen Typen abdecken. Gibt es eine Syntax zum Einschließen von z. zwei verschiedene Arten in der Signatur? So etwas wie Pseudocode unten.

public static Generic Get<Generic>(this [Entity, Entity2] input) 
{ 
    return (Generic)input; 
} 

Der beste Ansatz, den ich mir vorstellen kann, wie unten dargestellt, besteht aus einer Eingabemethode für jeden Typ und die Logik in einem privaten Ort. Es macht Sinn, wenn die Logik umfangreich ist, aber irgendwie überflüssig erscheint, wenn es nur ein oder zwei Zeilen sind.

public static Generic Get<Generic>(this Entity input) 
{ 
    return CommonLogic(input); 
} 

public static Generic Get<Generic>(this Entity2 input) 
{ 
    return CommonLogic(input); 
} 

private static Generic CommonLogic(Object input) 
{ 
    return (Generic)input; 
} 
+0

Ich würde sicher mit dem letzten Ansatz gehen oder es auf das Objekt setzen? –

+1

Gibt es irgendetwas gemeinsam zwischen "Entity" und "Entity2"? –

+6

Steuern Sie die Quelle der EntityX-Klassen? Wenn dies der Fall ist, könnten Sie eine (leere) Markierschnittstelle erstellen und nur diese Klassen implementieren die Schnittstelle. Dann muss der Parametertyp für diese Erweiterungsmethode von dieser Schnittstelle sein. – user469104

Antwort

5

C# unterstützt nicht die [Entity, Entity2] Notation, so dass Option aus ist.

Wenn Entity und Entity2 eine gemeinsame Schnittstelle oder Basisklasse, erklären sie dann als:

public static Generic Get<Generic>(this IEntityCommon input) 
{ 
    return (Generic)input; 
} 

Wenn nicht und Sie haben Entity erstellt, Entity2 etc, dann eine gemeinsame Schnittstelle hinzuzufügen. Diese Schnittstelle muss keine Methoden definieren und kann leer sein. Sie stellt lediglich einen allgemeinen Typ für die Erweiterungsmethode bereit.

Bei all dem ist der "CommonLogic" Weg die beste Option.

+0

Die Notation war nur ein Pseudo-Code, um die Erklärung zu verkürzen. Die Klassen teilen keine gemeinsame Schnittstelle, die nur ihnen gewidmet ist, und da die Logik sehr kurz ist, denke ich, dass es keinen Sinn macht, die Dinge richtig zu machen. Es ist jedoch gut, in einem allgemeinen Fall zu wissen. –

3

Sie etwas wie die

public static TSearch Get<TSource, TSearch>(this TSource obj) where TSource : BaseType, ISomeInterface 
    { 

    } 

T erst jetzt kann ISomeInterface von seinem Typ BaseType und Umsetzung tun könnte, aber dies würde es nicht auf eine fixe Anzahl der unterstützten Klassen machen aviable

eingeschränkt

EDIT:

Sie können nun diese auf Objekte von BaseType Typ verwenden ISomeInterface und Retu Umsetzung rn der angeforderte Typ TSearch. Sie können jedoch auch einfach where TSource : ISomeInterface verwenden. Der Schlüssel ist, dass Ihre Entity Klassen diese Schnittstelle implementieren.

Überprüfen Sie where - generic type constratint, um zu verstehen, wie man es benutzt.

+1

Damit dies funktioniert, benötigen Sie zwei generische Typen. Der Eingang und der Ausgang. Im Moment nimmt dies etwas von einem bestimmten Typ an und gibt denselben Typ zurück, was nicht der OP-Code ist. – juharr

+0

@juharr sollte jetzt passen (Wenn seine 'Entity' Klassen typeof' BaseType' und 'ISomeInterface' sind) – LuckyLikey

+1

Sie müssen' TSource' als generischen Typ für die Methode 'public static TSearch Get (Diese TSource obj) ' – juharr