2 Stimmen

Type.GetInterface und verschachtelte Typen

Ich habe gerade ein sehr seltsames Verhalten mit Type.GetInterface und verschachtelten Typen entdeckt.

Der folgende Beispielcode zeigt das Problem. Ich verwende den Type.FullName einer Schnittstelle, um zu prüfen, ob ein bestimmter Typ von dieser Schnittstelle abgeleitet ist:

public interface IStandardInterface {}
public class StandardClass : IStandardInterface {}

class Program
{
    public interface INestedInterface {}
    public class NestedClass : INestedInterface { }

    static void Main()
    {
        var stdIfName = typeof (IStandardInterface).FullName;
        var nestedIfName = typeof (INestedInterface).FullName;

        var std = typeof(StandardClass).GetInterface(stdIfName);
        var nested = typeof(NestedClass).GetInterface(nestedIfName);
    }
}

Wenn ich den obigen Code ausführe, funktioniert er für StandardClass, aber nicht für NestedClass.

  • std hat einen Wert von typeof(IStandardInterface)
  • verschachtelt hat einen Wert von null

Ist dieses Verhalten zu erwarten oder ein Fehler? Wenn es erwartet wird, könnten Sie erklären, warum?

Ich verwende .net Framework Version 3.5 SP1.

4voto

JaredPar Punkte 699699

Ich erweitere die Antwort von Marc.

Obwohl es nicht dokumentiert ist, wird die GetInterface-API den Namen, den Sie übergeben, anhand der Position des letzten "." im Namen aufteilen. Alles, was rechts vom "." steht, wird als Kurzname der fraglichen Schnittstelle angenommen.

Dies stellt ein Problem für verschachtelte Typen dar, da diese einen Namen haben, der "ContainingTypeName+NestedTypeName" lautet. Wenn Sie also den vollständigen Namen an GetInterface übergeben, wird am Ende nach einer Schnittstelle mit dem Namen "Program+INestedInterface" gesucht, die nicht gefunden wird.

2voto

Marc Gravell Punkte 970173

Es sieht aus wie ein Fehler Handhabung der "+"-Markierung für verschachtelte Namen... die folgenden (Betrug mit LINQ) funktioniert:

var nested = typeof(NestedClass).GetInterfaces()
            .SingleOrDefault(i => i.FullName == nestedIfName);

Natürlich würden Sie in den meisten Fällen einfach die is o as (oder vielleicht IsAssignableFrom ), um gegen eine Schnittstelle zu testen... was ist der Anwendungsfall hier?

1voto

Shaun Bowe Punkte 9412

Ich habe die Frage nicht richtig gelesen. Das sollte reichen, was Sie brauchen.

Boolean isSubClass = typeof(NestedClass).GetInterfaces().Contains(typeof(INestedInterface));

Ursprüngliche Antwort:

Ich bin nicht sicher, ob das ein Fehler ist oder nicht, aber dies ist der Code, den ich verwendet habe, um zu testen, ob ein Typ von einem anderen Typ abgeleitet ist.

typeof(NestedClass).IsInstanceOfType(typeof(IStandardInterface))

Ich habe in der Vergangenheit Probleme gehabt, wenn man sie in Namen umwandelt. Ich denke, im Allgemeinen sollten Sie bei den eigentlichen Typ-Objekten bleiben, wenn Sie können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X