Warum GetCustomAttributes Objekt [] anstelle von Attribut [] zurückgibt?

8

Nur neugierig, siehe MemberInfo.GetCustomAttributes . Zeigt es an, dass es ein Nicht-Attribut-Objekt enthalten könnte?

    
Danny Chen 01.03.2012, 06:16
quelle

3 Antworten

8

Dies liegt daran, dass die CLI-Spezifikation nicht erzwingt, dass Attribute von Attribute abgeleitet werden.

Die Spezifikation in Teil II 21 (Seite 225) , sagt:

  

Während   Jeder benutzerdefinierte Typ kann als Attribut verwendet werden. Die CLS-Konformität erfordert, dass Attribute Instanzen von sind   Typen, deren Basisklasse System.Attribute ist. Die CLI definiert einige Attributtypen vor und verwendet sie zur Steuerung   Laufzeitverhalten. Einige Sprachen geben Attributtypen vor, um Sprachmerkmale nicht direkt darzustellen   im CTS vertreten. Benutzer oder andere Tools können gerne zusätzliche Attributtypen definieren und verwenden.

Grundsätzlich kann die CLR selbst nicht garantieren, dass das Ergebnis Attribut ist - dies gilt nur für CLS-konforme Sprachen. Nicht-CLS-konforme Sprachen dürfen Attribute eines beliebigen Typs haben, dh ICustomAttributeProvider.GetCustomAttributes ( was ist die implementierte Schnittstelle in Frage) muss einen Mechanismus bereitstellen, um Attribute, die nicht Attribute abgeleitet sind, zu erhalten.

    
Reed Copsey 01.03.2012, 06:33
quelle
0

Pro MSDN: Ссылка

%Vor%

Nach meinem Verständnis können Sie sogar ein Attribut anpassen, ohne von System.Attribute zu erben, aber Ihr eigenes "Attribut" vollständig schreiben. Mit dieser Flexibilität kann Ihr "Attribut" nur manchmal Objekt

erben     
Simon Wang 01.03.2012 06:31
quelle
0

Zusätzlich zu dem oben genannten Reed können Sie mit der API MemberInfo.GetCustomAttributes einen Filtertyp angeben, der den Typ des zurückgegebenen Arrays beeinflusst. Wenn Sie also typeof (MyAttribute) angeben, ist das Ergebnis tatsächlich ein MyAttribute[] (in object[] umgewandelt).

Wenn Sie jetzt einen Schnittstellentyp IMyAttribute angeben, hat das Array den Typ IMyAttribute[] . Es ist zwar möglich, IMyAttribute[] auf object[] zu übertragen, es ist jedoch nicht möglich, sie in Attribute[] zu konvertieren. Also, im Wesentlichen wäre das Ergebnis ein Attribute[] , Filterung basierend auf Schnittstellen würde nicht funktionieren.

(BTW, die neueren Attribute.GetCustomAttributes APIs - die die Vererbungsauflösung für Eigenschaften und Ereignisse behebt - haben Attribute[] als ihren Rückgabetyp. Das macht Filtern basierend auf Schnittstellen unmöglich; Sie erhalten eine ArgumentException, wenn Sie versuchen, eine Schnittstellentyp zum Filtern.)

    
Fabian Schmied 19.02.2013 10:27
quelle

Tags und Links