Während etwas fast völlig irrelevant machen, eine Frage in meinen Kopf auftaucht:Kann obj.GetType(). IsInterface wahr sein?
Kann ein Ausdruck der Form obj.GetType().IsInterface
jemals in einer Code-Basis ausschließlich von C# -Code aus wahr sein?
Ich vermute, die Antwort ist nein, denn:
GetType()
immer den Laufzeittyp zurück.- Der Laufzeittyp für konkrete Typen stimmt mit dem aufgerufenen Konstruktor überein. Daher ist es niemals eine Schnittstelle, da Schnittstellen keine Konstruktoren haben.
- Anonyme Typen können keine Schnittstelle implementieren (und wenn dies der Fall wäre, hätten sie immer noch ihren anonymen Klassentyp).
- Instanzen interner Klassen anderer Assemblys, die öffentliche Schnittstellen implementieren, haben weiterhin die Klasse als Laufzeittyp.
- Using
[ComImport, CoClass(typeof(MyClass))]
on an interface lässt es aussehen, als ob Sie es instanziieren können, aber der Konstruktoraufruf instanziiert tatsächlich die referenzierte Klasse.
Ich kann an keinen anderen Fall denken. Fehle ich etwas, oder ist meine Annahme richtig?
Devious. Ich denke, das ist zwei oder drei Abzeichen wert. :) – Jon
+1 für den Nachweis, dass es getan werden kann, aber es gibt einige Dinge, die am besten nicht gelehrt werden. Wenn ich * jemals * Code reparieren muss, der das getan hat. Ich werde dich finden @Jon. Einfach nur Witze machen. :) – cgTag
Für COM-Klassen ist 'new ISomeComInterface()' lediglich ein Compiler-Trick: Es übersetzt es in etwas anderes, entweder 'new SomeComClass()' oder 'Activator.CreateInstance (Type.GetTypeFromCLSID (SomeComGuid))' '. Wie auch immer, die Laufzeitumgebung wird niemals eine Schnittstelle erzeugen, daher glaube ich nicht, dass sie verwendet werden kann, um mit GetType() eine Schnittstelle zurückzugeben. – hvd