Ich verwende ein benutzerdefiniertes Attribut, das von einer Attributklasse geerbt wurde. Ich benutze es so:
[MyCustomAttribute("CONTROL")]
[MyCustomAttribute("ALT")]
[MyCustomAttribute("SHIFT")]
[MyCustomAttribute("D")]
public void setColor()
{
}
Der Fehler "Duplicate 'MyCustomAttribute' attribute" wird jedoch angezeigt.
Wie kann ich ein doppeltes zulässiges Attribut erstellen?
c#
attributes
ebattulga
quelle
quelle
AttributeUsageAttribute ;-p
Beachten Sie jedoch, dass bei Verwendung von ComponentModel (
TypeDescriptor
) nur eine Attributinstanz (pro Attributtyp) pro Mitglied unterstützt wird. Rohreflexion unterstützt eine beliebige Anzahl ...quelle
Antons Lösung ist richtig, aber es gibt noch einen anderen Fall .
Kurz gesagt, wenn Ihr benutzerdefiniertes Attribut TypeId nicht überschreibt, wird beim Zugriff über
PropertyDescriptor.GetCustomAttributes()
nur eine einzige Instanz Ihres Attributs zurückgegeben.quelle
Standardmäßig dürfen
Attribute
s nur einmal auf ein einzelnes Feld / eine Eigenschaft / etc. Angewendet werden. Sie können dies aus der Definition derAttribute
Klasse in MSDN ersehen :Daher ist , wie andere haben festgestellt, werden alle Unterklassen in der gleichen Art und Weise beschränkt, und es sollten Sie mehrere Instanzen des gleichen Attribut erfordern, müssen Sie explizit
AllowMultiple
auftrue
:Bei Attributen, die mehrere Verwendungen zulassen, sollten Sie die
TypeId
Eigenschaft auch überschreiben, um sicherzustellen, dass Eigenschaften wiePropertyDescriptor.Attributes
erwartet funktionieren. Der einfachste Weg, dies zu tun, besteht darin, diese Eigenschaft zu implementieren, um die Attributinstanz selbst zurückzugeben:(Diese Antwort nicht veröffentlichen, weil die anderen falsch sind, sondern weil dies eine umfassendere / kanonischere Antwort ist.)
quelle
Denken Sie alternativ daran, Ihr Attribut neu zu gestalten, um eine Sequenz zu ermöglichen.
oder
Analysieren Sie dann die Werte, um Ihr Attribut zu konfigurieren.
Ein Beispiel hierfür finden Sie im AuthorizeAttribute im ASP.NET MVC-Quellcode unter www.codeplex.com/aspnet .
quelle
MyCustomAttribute
Konstruktor ein Array von Zeichenfolgen astring[]
mit oder ohneparams
Modifikator verwendet. Dann könnte es mit der Syntax[MyCustom("CONTROL", "ALT", "SHIFT", "D")]
(mitparams
) angewendet werden .Stellen Sie nach dem Hinzufügen der AttributeUsage sicher, dass Sie diese Eigenschaft Ihrer Attribute-Klasse hinzufügen
quelle