2010-08-30 10 views
8

Gibt es sowieso eine Constraints für eine generische Definition zu erzwingen, um eine "generische Schnittstelle" zu implementieren ... das heißt, ich möchte die Klasse die Übergabe einer Schnittstelle und eine generische Klasse damit zu beschränken Die Klasse implementiert die Schnittstelle. Zum Beispiel, wenn ich sage:Force generische Schnittstellenimplementierung in C#

MyGenericClass<IMyInterface, MyImplementation>.DoSomething(); 

Das so dass MyImplementation implementiert IMyInterface

Was gezwungen werden sollte, wie ich weiß, dass durch

public class Dynamic_Loader<T, S> where S: T 

Jetzt erreicht werden kann, ist es auch ohnehin zwingen T, eine Schnittstelle zu sein?

Edit: Der Zweck dieser war wie etwas zu haben:

private static List<T> interfaceList = new List<T>(); 

public static List<T> InterfaceList {get { return interfaceList;}} 

public static void Add(S input) { interfaceList.Add(input);} 

und die Liste auf Schnittstellen beschränkt haben (da es angeblich Implementierungen von bestimmten Schnittstellen zurückzukehren)

Antwort

7

Meinst du, kann eine Beschränkung auch auf T wie where T : interface gesetzt werden?

Wenn ja, dann keine: this list so ziemlich deckt Ihre Optionen.

Was Sie haben, ist so nah wie möglich, glaube ich.

Aus Neugier, was wäre der Grund dafür, T zu einer Schnittstelle zu beschränken?

Oder haben Sie bedeuten eine Einschränkung auch auf T für T- einige spezifische Schnittstelle implementieren umgesetzt werden?

Wenn ja, dann ja: einfach zwei where Klauseln (z.B. where S : T where T : U).

+0

Oh, ich war für diese gehen: public static List interfacelist = new List ; public static void Hinzufügen (S input); Und ja, es wird auch funktionieren, wenn T nur eine Basisklasse ist, aber der Client sollte Schnittstellen, nicht Basisklassen bekommen. –

3
where T: IMyOtherInterfaceForT 

Beispiel:

public class Test<T, V> 
    where T : V 
    where V : IEnumerable<int> 
    { 
    } 
1

Sie könnten so etwas tun, um es zur Laufzeit statt zur Kompilierzeit zu erzwingen.

public class Test<T> where T : class 
{ 
    public Test() 
    { 
    Type t = typeof(T); 
    if(!t.IsInterface) 
     throw new ArgumentException("T must be an interface type"); 
    } 
} 
Verwandte Themen