Frage

Mein Problem ist, dass TypeDescriptor keine Mitglieder von ererbten Schnittstellen zurückgibt. Soll er so funktionieren? Oder ist es ein Fehler?

 [TestFixture]
    public class DescriptorTests
    {
        [Test]
        public void Test()
        {
                                                                    // count = 1 
            Assert.AreEqual(2, TypeDescriptor.GetProperties(typeof(IFoo)).Count);
     // it is going to fail, the Id is not going to be returned
        }

        public interface IEntity
        {
            int Id { get; set; }
        }

        public interface IFoo : IEntity
        {
            string Name { get; set; }
        }
    }
War es hilfreich?

Lösung

Das ist kein Fehler. Von dem ECMA CLI -Spezifikation:

8.9.11 Schnittstellentyp Derivation

Schnittstellentypen können die Implementierung eines oder mehrerer anderer Schnittstellen erfordern. Jeder Typ, der Unterstützung für einen Schnittstellentyp implementiert, muss auch die Unterstützung für alle erforderlichen Schnittstellen implementieren, die von dieser Schnittstelle angegeben sind. Dies unterscheidet sich auf zwei Arten von der Vererbung des Objekttyps:

  • Objekttypen bilden einen einzelnen Vererbungsbaum; Schnittstellentypen nicht.
  • Objekttyp -Vererbung gibt an, wie Implementierungen vererbt werden. Erforderliche Schnittstellen nicht, da Schnittstellen die Implementierung nicht definieren. Erforderliche Schnittstellen geben zusätzliche Verträge an, die ein Implementierungsobjekttyp unterstützt.

Um den letzten Unterschied hervorzuheben, betrachten Sie eine Schnittstelle, IFoo, das hat eine einzelne Methode. Eine Schnittstelle, IBar, was sich daraus ergibt, erfordert, dass jeder Objekttyp, der unterstützt IBar auch Unterstützung IFoo. Es sagt nichts darüber aus, welche Methoden IBar selbst wird haben.

8.10 Mitgliedserbschaft

Nur Objekttypen können Implementierungen erben, daher können nur Objekttypen Mitglieder erben (siehe §8.9.8). Während Schnittstellentypen aus anderen Schnittstellentypen abgeleitet werden können, "erben" sie nur die Anforderung, Methodenverträge, niemals Felder oder Methodenimplementierungen zu implementieren.

Bearbeiten...

Wenn Sie die Eigenschaften einer Schnittstelle erhalten möchten, einschließlich der ihrer Vorfahren, können Sie so etwas tun:

var properties = typeof(IFoo)
                     .GetProperties()
                     .Union(typeof(IFoo)
                                .GetInterfaces()
                                .SelectMany(t => t.GetProperties()));

Andere Tipps

Sie haben Recht. Ich denke, es ist ein Fehler, da es für ererbte Eigenschaften für Klassen funktioniert!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top