Używam atrybutu niestandardowego dziedziczonego z klasy atrybutów. Używam tego w ten sposób:
[MyCustomAttribute("CONTROL")]
[MyCustomAttribute("ALT")]
[MyCustomAttribute("SHIFT")]
[MyCustomAttribute("D")]
public void setColor()
{
}
Ale wyświetlany jest błąd „Duplikat atrybutu„ MyCustomAttribute ””.
Jak mogę utworzyć zduplikowany dozwolony atrybut?
c#
attributes
ebattulga
źródło
źródło
AttributeUsageAttribute ;-p
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)] public class MyAttribute : Attribute {}
Należy jednak pamiętać, że jeśli używasz ComponentModel (
TypeDescriptor
), obsługuje on tylko jedną instancję atrybutu (na typ atrybutu) na członka; surowe odbicie obsługuje dowolną liczbę ...źródło
Rozwiązanie Antona jest poprawne, ale jest jeszcze jeden problem .
Krótko mówiąc, jeśli atrybut niestandardowy nie zastępuje TypeId, dostęp do niego za pośrednictwem
PropertyDescriptor.GetCustomAttributes()
zwróci tylko jedno wystąpienie atrybutu.źródło
Domyślnie
Attribute
s są ograniczone do jednorazowego zastosowania do pojedynczego pola / właściwości / itp. Możesz to zobaczyć z definicjiAttribute
klasy w MSDN :[AttributeUsageAttribute(..., AllowMultiple = false)] public abstract class Attribute : _Attribute
Dlatego, jak zauważyli inni, wszystkie podklasy są ograniczone w ten sam sposób i jeśli potrzebujesz wielu wystąpień tego samego atrybutu, musisz jawnie ustawić
AllowMultiple
natrue
:[AttributeUsage(..., AllowMultiple = true)] public class MyCustomAttribute : Attribute
W przypadku atrybutów, które umożliwiają wielokrotne użycie, należy również zastąpić
TypeId
właściwość, aby upewnić się, że właściwości, takie jak właściwości,PropertyDescriptor.Attributes
działają zgodnie z oczekiwaniami. Najłatwiejszym sposobem jest zaimplementowanie tej właściwości w celu zwrócenia samej instancji atrybutu:[AttributeUsage(..., AllowMultiple = true)] public class MyCustomAttribute : Attribute { public override object TypeId { get { return this; } } }
(Publikowanie tej odpowiedzi nie jest spowodowane tym, że inni się mylą, ale dlatego, że jest to bardziej kompleksowa / kanoniczna odpowiedź).
źródło
Alternatywnie zastanów się nad przeprojektowaniem atrybutu, aby umożliwić sekwencję.
[MyCustomAttribute(Sequence="CONTROL,ALT,SHIFT,D")]
lub
[MyCustomAttribute("CONTROL-ALT-SHIFT-D")]
następnie przeanalizuj wartości, aby skonfigurować atrybut.
Na przykład sprawdź AuthorizeAttribute w kodzie źródłowym ASP.NET MVC pod adresem www.codeplex.com/aspnet .
źródło
MyCustomAttribute
konstruktor pobierał tablicę łańcuchów, astring[]
, zparams
modyfikatorem lub bez niego . Następnie można go zastosować za pomocą składni[MyCustom("CONTROL", "ALT", "SHIFT", "D")]
(zparams
).Po dodaniu AttributeUsage upewnij się, że dodajesz tę właściwość do swojej klasy Attribute
public override object TypeId { get { return this; } }
źródło