Nur neugierig, siehe MemberInfo.GetCustomAttributes
. Zeigt es an, dass es ein Nicht-Attribut-Objekt enthalten könnte?
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.
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 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.)
Tags und Links .net c# attributes reflection