2010-05-27 7 views
8

Jetzt, da wir generische Kovarianz und Kontravarianz auf Schnittstellen und Delegaten in C# haben, war ich nur neugierig, wenn Sie eine Type geben, können Sie die Kovarianz/Kontravarianz seiner generischen Argumente herausfinden. Ich fing an, zu versuchen, meine eigene Implementierung zu schreiben, die alle Methoden auf einem gegebenen Typ durchsehen und sehen würde, ob die Rückgabetypen und oder Argumente mit den Typen in den allgemeinen Argumenten übereinstimmen. Das Problem ist, dass selbst wenn ich diese:Gibt es eine Möglichkeit, die Varianz einer Schnittstelle/eines Delegaten in C# 4.0 zu bestimmen?

public interface IFoo<T> 
{ 
    void DoSomething(T item); 
} 

mit meiner Logik, es sieht aus wie es kontra sein sollte, aber da wir nicht wirklich angegeben haben:

public interface IFoo<in T> 
{ 
    void DoSomething(T item); 
} 

(der in Parameter) es ist nicht wirklich kontravariant. Was zu meiner Frage führt: Gibt es eine Möglichkeit, die Varianz generischer Parameter zu bestimmen?

+0

warum würden Sie das brauchen? –

+0

@ Mitch Ich werde dich wissen lassen, wenn ich das herausgefunden habe :) Ich habe nur aus Neugier gefragt ... – BFree

Antwort

5

Ich weiß nicht, warum Sie das wollen, aber Sie können es mit Reflexion von außerhalb des Typs betrachten. Hier Informationen zu betrachten Allgemeine Parameter für einen Typ mit Reflexion:

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

Insbesondere die Eigenschaft Type.GenericParameterAttributes auf dem Typ, den Sie von einem Aufruf Type.GetGenericParameters wieder wird die Co/Kontra Eigenschaften zeigen das generische Argument ... es ist eine bitweise Enumeration, die die Kombination dieser Informationen offenbart:

http://msdn.microsoft.com/en-us/library/system.reflection.genericparameterattributes.aspx

Wirklich interessant ... danke für die Nachfrage dies und ich es nachzuschlagen.

+1

Genau das, was ich gesucht habe. Eine andere interessante Sache ist, wenn man sich den zweiten Link anschaut, heißt es, dass es seit .Net 2.0 unterstützt wird. Ich denke, es war schon immer da, seit andere Sprachen Covariance/Contravariance für eine Weile unterstützen (denke ich ...). Nie bemerkt, dass .... – BFree

+0

@BFree: interessante Beobachtung. Ich muss das für später verlassen. –

Verwandte Themen