Reflection->Interfaces
-
Ich versuche gerade per Reflection die Membervariablen einer Klasse herauszufinden. Das geht wohl scheinbar mit GetFields. Da bekomme ich namen und type her. Wie kann ich nur herausfinden ob der type des fields ein bestimmtes Interface Implementiert?
-
Ich kann mich irren, aber kannst du nicht folgendes probieren:
if(field is InterfaceName) { whatever to do; }
Ich bin mir nicht sicher, aber denke dass das funktionieren könnte.
-
Hilft dir eventuell dieser Beitrag hier?
http://www.hanselman.com/blog/DoesATypeImplementAnInterface.aspx
-
Ach stimmt,
if(field.GetType().IsAssignableFrom(typeof(MyInterface)) { whatever to do here; }
gibt es ja auch noch. - Hab damit doch erst vor kurzem gearbeitet. -> Wäre denk ich der bessere weg Fedaykin.
-
Besten dank.
-
Dank extensions Methods kann man das auch noch ein wenig verschönern:
public static class ExtendedType { public static bool IsImplementationOf(this Type thisType, Type objType) { return thisType.IsInterface && thisType.IsAssignableFrom(objType); } public static bool HasInterface(this Type thisType, Type interfaceType) { return interfaceType.IsImplementationOf(thisType); } } // ... if(field.GetType().HasInterface(typeof(IUnknown))) { // ... }
Grüssli
-
Hat nichts mit dem Thema zu tun, aber wie kommst du auf "HasInterface"?
-
CSL schrieb:
Hat nichts mit dem Thema zu tun, aber wie kommst du auf "HasInterface"?
Aus reiner Verzweiflung ... mir ist einfach nichts sinnvolles eingefallen. Aber es ist sowas von falsch, dennoch besser als nichts :p
VielleichtIsInterface
? Aber auch nicht wirklich gut.ImplementsInterface
fand ich auch schrecklich. Irgendeine gute Idee?Grüssli
-
Bullshit - wer original sehen will muss zitieren (und im Quelltext betrachten
[h1] [cli] BULLSHIT weil: TOther als INTERFACE erwartet wird - u.U. nicht gewinnbringend siehe Scott Hanselman's Blogpost. ich würde eher [cs] // VORSICHT KANN/WIRD FEHLER ENTHALTEN --- DA KEIN COPMPILER GERADE ZUR HAND public static bool IsImplementationOf<TOther>(this Type thisType) { return thisType.IsInterface && thisType is TOther; return thisType.IsInterface && (thisType as TOther) != null; } public static bool Implements<TOther>(this Type thisType) { return typeof(TOther).IsImplementationOf(typeof(thisType)); return thisType is TOther; return (thisType as TOther) != null; } [/cs]nehmen[/h1][/cli]
-
@Dravere
Ich würde einfach nur "Implements" sagen
bei Basisklassen sagt man ja "is" und bei interfaces "implements", da erübrigt sich das Wort Interface