2014-08-30 7 views
25

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?

Antwort

38

Kann ein Ausdruck des Formulars obj.GetType().IsInterface jemals in einer Codebasis wahr sein, die ausschließlich aus C# -Code besteht?

Ja - aber wahrscheinlich nicht so, wie Sie dachten an:

using System; 

public class EvilClass 
{ 
    public new Type GetType() 
    { 
     return typeof(IDisposable); 
    } 
} 

class Test 
{ 
    static void Main() 
    { 
     EvilClass obj = new EvilClass(); 
     Console.WriteLine(obj.GetType().IsInterface); // True 
    } 
} 

Etwas ähnlich, glaube ich, Sie eine Unterklasse von RealProxy schaffen könnte, die den Anruf würde abfangen und das Rück einen Schnittstellentyp.

Wenn Sie meinen "wird der Rückgabewert der GetType() Methode, die in object erklärt wird, jemals ein Schnittstellentyp sein" - in diesem Fall vermute ich, dass die Antwort nein ist.

+5

Devious. Ich denke, das ist zwei oder drei Abzeichen wert. :) – Jon

+7

+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

+0

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

Verwandte Themen