Überprüfen Sie, ob ein Typ implementiert ein generisches interface ohne Rücksicht auf die generische typargumente
Habe ich eine Schnittstelle
public interface MyInterface<TKey, TValue>
{
}
Implementierungen sind irrelevant. Jetzt will ich überprüfen, ob ein bestimmter Typ eine Implementierung der Schnittstelle. Diese Methode schlägt fehl, für
public class MyClass : MyInterface<int, string>
{
}
Aber ich weiß nicht, wie zu tun, die überprüfen.
public void CheckIfTypeImplementsInterface(Type type)
{
var result1 = typeof(MyInterface<,>).IsAssignableFrom(type); --> false
var result2 = typeof(MyInterface<int,string>).IsAssignableFrom(type); --> true
}
Was muss ich tun, damit ergebnis1, um wahr zu sein?
- Haben Sie überlegt, ein
MyInterface
Schnittstelle und habenMyInterface<TKey, TValue> : MyInterface
?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Soweit ich weiß, ist der einzige Weg, dies zu tun ist, um alle Schnittstellen zu sehen, ob das generische definition entspricht der erforderlichen interface-Typ.
EDIT: Als Jon Punkte in die Kommentare, könnte man auch machen:
.Any(i => i.GetGenericTypeDefinition() == typeof(MyInterface<,>))
.Any(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(MyInterface<,>))
(wodurch die Notwendigkeit für.Where
, da.Any
ist bereits filtern der Elemente)In der Regel, ein solches Verhalten ist nur erforderlich, in Fällen, in denen ein interface enthält einige Funktionen, die hängt nicht von den generischen Typ-Parameter. Wenn Sie haben die Kontrolle über die Schnittstellen, die beste Lösung ist, um die Typ-abhängigen Teile Erben von einer nicht-Typ-abhängige Teil. Zum Beispiel, wenn die bestehende Sammlung Schnittstellen nicht existieren, man könnte Sie definieren so etwas wie:
Hatte, so eine Sache getan
ICollection
, dann code, den erwartet eineIEnumerable<Animal>
bekam aber ein Objekt vom TypCatList
dass gerade implementiertIList<Cat>
hätte kein problem mit derCount
Mitglied des Objekts (beachten Sie, dassList<Animal>
implementiert die nicht-generischeICollection
, aber andereIList<Animal>
Implementierungen möglicherweise nicht).Wie es ist, wenn Sie fest sind, mit der Aufgabe, dass code irgendwie finden die
Count
Methode derICollection<Cat>
wenn Sie erwarten einIEnumerable<Animal>
kann es lohnenswert sein, etwas zu bauen wie einDictionary<Type, Func<IEnumerable<Animal>, int>
so, dass, sobald Sie haben festgestellt, dassCatList
implementiertICollection<Cat>.Count
können Sie konstruieren eine delegate auf eine Methode, die gewirkt wird, dessen argument zuICollection<Cat>
rufenCount
auf Sie, und, wieder in seine Ergebnis. Wenn Sie ein solches Wörterbuch, dann, wenn Sie einen anderenCatList
Sie werden in der Lage sein, um Sie einfach aufrufen, die Delegierten aus dem Wörterbuch.[CustomAttribute(typeof(ClassName))]
und ich benötigen ClassName die Schnittstelle implementieren.Später im code, ich weiß, sowohl die generischen Attribute und können mithilfe von reflektion, erstellen einer neuen Instanz von ClassName