2009-05-19 16 views
3

Im folgenden Code "where T: WsgTypes.RouteRestriction", kann ich mehrere Klassen hinzufügen, so dass T nur die wenigen Klassen Typen sein, die ich interessiert bin vonGenerics C# .net

public static T GetDetails<T>(string code) where T : WsgTypes.RouteRestriction 
    { 
     T details; 
     if (typeof(T) == typeof(WsgTypes.TicketType)) 
     { 
      details = TicketTypeDetail.GetDetails(code) as T; 

     } 
     else if (typeof(T) == typeof(WsgTypes.RouteRestriction)) 
     { 
      details = RouteRestrictionDetail.GetDetails(code) as T; 

     } 
     else 
     { 
      throw new NotSupportedException(""); 
     } 
     return details; 
     throw new NotImplementedException(); 
    } 
+0

Dies ist nicht, was generische Methoden entwickelt wurden. Wenn Sie nur ein paar Möglichkeiten haben, dann verwenden Sie keine generische Methode an erster Stelle. Wenn es nur drei mögliche Typen gibt, schreiben Sie drei verschiedene Methoden. Generics wurden für die Fälle entwickelt, in denen der Typ wirklich generisch ist - wo er beliebig viele Typen haben kann. –

Antwort

1

Für Vererbung Sie eine einzelne Klasse mit mehreren Schnittstellen haben kann.

public static T GetDetails<T>(string code) where T : WsgTypes.RouteRestriction, , IComparable 
    { 
    } 

Stattdessen können Sie eine Schnittstelle haben und mehrere Klassen implementieren.

public interface IInterface 
    {} 

    public class Class1: IInterface 
    {} 

    public class Class2: IInterface 
    {} 

public static T GetDetails<T>(string code) where T:IInterface 
     { 
      T instance; 
      // ... 
      return instance; 
     } 
1

I‘ Ich fürchte, du kannst nicht. Der übliche Weg besteht darin, eine gemeinsame Schnittstelle bereitzustellen, an der alle Klassen teilnehmen, an denen Sie interessiert sind. Das Problem besteht darin, dass der Compiler innerhalb des generischen Körpers erwartet, dass ein generischer Typparameter eindeutig ist.

Nun, oder Sie können ein Objekt als Parameter übernehmen und es an Ihrem Willen werfen. Aber nein. Nicht.

Beachten Sie, dass anstelle von typeof auch die Operatoren is und as verwendet werden können.

1

diesen Artikel ansehen ...

http://msdn.microsoft.com/en-us/library/d5x73970.aspx

... Weitere Informationen über constaints. Sie können mehrere Einschränkungen hinzufügen, und Sie können durch eine Schnittstelle oder durch eine Basisklasse, aber nicht durch eine Liste von beliebigen Klassen beschränken.

Hier ist ein Beispiel von mehreren Einschränkungen (von oben):

class Base { } 
class Test<T, U> 
    where U : struct 
    where T : Base, new() { } 
+0

In diesem Artikel wird erläutert, wie mehrere Einschränkungen für denselben Typ verwendet werden, d. H. Der generische Parameter muss ALLE implementieren. – OregonGhost

+0

In Ihrem Beispiel werden verschiedene Einschränkungen für verschiedene Typargumente erläutert. Dies ist wahrscheinlich nicht das, was Miral möchte. – OregonGhost

+0

Ja - falsch gelesen die Frage. Editing now ... –

0

Hast du sie so versuchen zu trennen:

public static T GetDetails<T>(string code) where T : WsgTypes.RouteRestriction, NextClass, AnotherClass, AndSoOn 
{ 
... 
} 
+0

das ist nicht möglich – Miral

4

Nein, kann generische Typ Einschränkungen nur eine einzige Basisklasse angeben.

können Sie mehrere Schnittstellen angeben, aber das ist „alle“, nicht „alle“.

Was Sie ist möglich, fragen mit Überlastung, aber nicht mit Generika.

5

Es scheint mir, dass diese Verwendung von Generika nicht korrekt ist. Es wäre besser, wenn TicketType und RouteRestriction einige IDetailed umgesetzt.

+0

Ja, das ist eine detaillierte Version von dem, was ich im Allgemeinen beschrieben habe :) – OregonGhost