property net custom attribute attrib asp c# custom-attributes

net - custom property c#



Un argumento de atributo debe ser una expresión constante,...-Crear un atributo de tipo array (3)

Aquí está mi atributo personalizado y una clase en la que lo estoy usando:

[MethodAttribute(new []{new MethodAttributeMembers(), new MethodAttributeMembers()})] public class JN_Country { } public class MethodAttribute : Attribute { public MethodAttributeMembers[] MethodAttributeMembers { get; set; } public MethodAttribute(MethodAttributeMembers[] methodAttributeMemberses) { MethodAttributeMembers = methodAttributeMemberses; } } public class MethodAttributeMembers { public string MethodName { get; set; } public string Method { get; set; } public string MethodTitle { get; set; } }

El error de sintaxis, que se muestra en la primera línea de arriba:

Un argumento de atributo debe ser una expresión constante, tipo de expresión o expresión de creación de matriz de un tipo de parámetro de atributo

¿Por qué se produce este error?


Esto complementa la información que Simon ya dio.

Encontré algo de documentación aquí: Atributos Tutorial . (Dice Visual Studio .NET 2003 en la parte superior, pero aún se aplica.)

Los parámetros de atributo están restringidos a valores constantes de los siguientes tipos:

  • Tipos simples (bool, byte, char, short, int, long, float y double)
  • cuerda
  • Tipo de sistema
  • enums
  • objeto (el argumento de un parámetro de atributo de tipo objeto debe ser un valor constante de uno de los tipos anteriores).
  • Matrices unidimensionales de cualquiera de los tipos anteriores (énfasis agregado por mí)

El último punto de viñeta explica el error de sintaxis. Ha definido una matriz unidimensional, pero solo debe ser de tipos primitivos, cadenas, etc., como se indica en los puntos anteriores.


Los argumentos de atributo deben ser constantes en tiempo de compilación. Eso significa que el compilador debe poder "hornear" los valores de los argumentos cuando se compila el ensamblaje. new ReferenceType() no es constante; debe evaluarse en tiempo de ejecución para determinar qué es.

Curiosamente, esto es un poco débil en el sentido de que hay algunos casos de ventaja en esa regla. Sin embargo, aparte de esos, no puedes hacer lo que intentas hacer.


Permítame agregar que el compilador puede devolver este error sin ningún archivo o línea de código en particular, si su atributo tiene un constructor que tiene un parámetro que no es un tipo simple y usted usa el constructor (es decir, su parámetro no simple tiene un valor por defecto).

[MyAttribute(MySimpleParameter: "Foo")] public class MyObject { } public class MyAttribute : Attribute { public string MySimpleProperty { get; set; } public MyPropertyClass MyComplexProperty { get; set; } public MethodAttribute(string MySimpleParameter, MyPropertyClass MyComplexParameter = null) { MySimpleProperty = MySimpleParameter; MyComplexProperty = MyComplexParameter; } } public class MyPropertyClass { public string Name { get; set; } public string Method { get; set; } }