Hat Reflexion in C#
Angebot eine Möglichkeit , wenn einige gegeben , um zu bestimmen System.Type
Typ Modelle einige Schnittstelle?
public interface IMyInterface {}
public class MyType : IMyInterface {}
// should yield 'true'
typeof(MyType)./* ????? */MODELS_INTERFACE(IMyInterface);
c#
reflection
interface
Yippie-Ki-Yay
quelle
quelle
IsAssignableFrom
rückwärts zu bekommen. Ich werde jetzt mit gehenGetInterfaces
: pIsAssignableFrom(t1)
Variante ist ca. 3x schneller als dasGetInterfaces().Contains(t2)
Gegenstück in meinem Code.typeof(MyType).GetInterface(nameof(IMyInterface)) != null
für mehr Typensicherheit und Refactoring sorgen.Verwendung
Type.IsAssignableFrom
:quelle
oder
quelle
someclass is IMyInterface
da dies überhaupt keine Kosten für die Reflexion mit sich bringt. Es ist zwar nicht falsch, aber kein idealer Weg, dies zu tun.is
Überprüft tatsächlich in beide Richtungen der Vererbungshierarchie, währendIsAssignableFrom
nur nach oben geprüft wird. Wenn Sie eine Instanz eines Objekts haben, sollten Sie auch aufrufenIsInstanceOfType
(das auch nur nach oben schaut).Ich denke, dies ist aus drei Gründen die richtige Version:
quelle
Ich habe gerade getan:
Ich wünschte, ich hätte sagen können
where I : interface
, ist aberinterface
keine generische Option für Parametereinschränkungen.class
ist so nah wie es nur geht.Verwendungszweck:
Ich habe nur gesagt,
Implements
weil das intuitiver ist. Ich bekomme immerIsAssignableFrom
Flip-Flops.quelle
return typeof(I).IsInterface && typeof(I).IsAssignableFrom(source);
, um bei "falschen" Verwendungen der Methode false zurückzugeben. Wenn Sie es mit einem Klassentyp anstelle eines Schnittstellentyps verwenden, können Sie alternativ eine Ausnahme auslösen, wenn der Typparameter keine Schnittstelle ist. Obwohl Sie argumentieren könnten, dass eine abgeleitete Klasse ihre Eltern "implementiert" ...Ändern von Jeffs Antwort für optimale Leistung (dank Leistungstest von Pierre Arnaud):
So finden Sie alle Typen, die eine Schnittstelle in einem bestimmten Bereich implementieren
Assembly
:quelle
Wie schon jemand anderes erwähnt: Benjamin 10. April 13 um 22:21 "
Ein anderer Weg besteht darin, eine kurze Erweiterungsmethode zu erstellen, die zum Teil die "üblichste" Denkweise erfüllt (und sich einig ist, dass dies eine sehr kleine persönliche Entscheidung ist, um sie je nach den eigenen Vorlieben etwas "natürlicher" zu machen ):
Und warum nicht ein bisschen allgemeiner vorgehen (na ja, ich bin mir nicht sicher, ob es wirklich so interessant ist, ich nehme an, ich gebe nur eine weitere Prise 'Syntaxing'-Zucker):
Ich denke, dass es auf diese Weise viel natürlicher sein könnte, aber noch einmal nur eine Frage sehr persönlicher Meinungen:
quelle
Boolean
=>bool
(Ich weiß nicht, warum ich in meiner Jugend einige strenge "ausgefallene" Codierungsregeln hatte).Wenn Sie einen Typ oder eine Instanz haben, können Sie leicht überprüfen, ob diese eine bestimmte Schnittstelle unterstützen.
So testen Sie, ob ein Objekt eine bestimmte Schnittstelle implementiert:
So testen Sie, ob ein Typ eine bestimmte Schnittstelle implementiert:
Wenn Sie ein generisches Objekt haben und eine Umwandlung sowie eine Überprüfung durchführen möchten, ob die Schnittstelle, in die Sie umgewandelt haben, implementiert ist, lautet der Code:
quelle
IsAssignableFrom
wird jetzt verschoben nachTypeInfo
:quelle
Jeder, der danach sucht, könnte die folgende Erweiterungsmethode nützlich finden:
Xunit-Tests:
quelle
wie wäre es mit
?
quelle
Wie wäre es mit
quelle
Eine richtige Antwort ist
Jedoch,
Möglicherweise wird ein falsches Ergebnis zurückgegeben, wie der folgende Code mit string und IConvertible zeigt:
Ergebnisse:
quelle
IsAssignableFrom
. Genau wie Benjamin und Ehouarn warnen.Beachten Sie, dass bei einer generischen Schnittstelle
IMyInterface<T>
immer Folgendes zurückgegeben wirdfalse
:Das funktioniert auch nicht:
Wenn dies jedoch
MyType
implementiertIMyInterface<MyType>
wird, funktioniert dies und gibt Folgendes zurücktrue
:Wahrscheinlich kennen Sie den Typparameter
T
zur Laufzeit jedoch nicht . Eine etwas hackige Lösung ist:Jeffs Lösung ist etwas weniger hackig:
Hier ist eine Erweiterungsmethode
Type
, die in jedem Fall funktioniert:(Beachten Sie, dass oben linq verwendet wird, das wahrscheinlich langsamer als eine Schleife ist.)
Sie können dann tun:
quelle