Tengo un atributo personalizado, dentro del constructor de mi atributo personalizado Quiero establecer el valor de una propiedad de mi atributo para el tipo de la propiedad a la que se aplicó mi atributo, ¿hay alguna manera de acceder al miembro que el atributo era aplicado desde dentro de mi clase de atributo?¿Obtener miembro a qué atributo se aplicó desde dentro del constructor de atributos?
Respuesta
Los atributos no funcionan de esa manera, me temo. Son simplemente "marcadores", unidos a los objetos, pero no pueden interactuar con ellos.
Los atributos en sí mismos generalmente deben estar desprovistos de comportamiento, simplemente contienen metadatos para el tipo al que están adjuntos. Cualquier comportamiento asociado con un atributo debe ser proporcionado por otra clase que busque la presencia del atributo y realice una tarea.
Si está interesado en el tipo al que se aplica el atributo, esa información estará disponible al mismo tiempo que se refleja para obtener el atributo.
Como dices, no es el fin del mundo ya que conoces el tipo al obtener el atributo personalizado a través de Reflection, pero sería "bueno" si el tipo pasado a GetCustomAttribute también se almacenó en System.Attribute –
Puedes hacer lo siguiente. Es un simple ejemplo.
//target class
public class SomeClass{
[CustomRequired(ErrorMessage = "{0} is required", ProperytName = "DisplayName")]
public string Link { get; set; }
public string DisplayName { get; set; }
}
//custom attribute
public class CustomRequiredAttribute : RequiredAttribute, IClientValidatable
{
public string ProperytName { get; set; }
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var propertyValue = "Value";
var parentMetaData = ModelMetadataProviders.Current
.GetMetadataForProperties(context.Controller.ViewData.Model, context.Controller.ViewData.Model.GetType());
var property = parentMetaData.FirstOrDefault(p => p.PropertyName == ProperytName);
if (property != null)
propertyValue = property.Model.ToString();
yield return new ModelClientValidationRule
{
ErrorMessage = string.Format(ErrorMessage, propertyValue),
ValidationType = "required"
};
}
}
Es posible de .NET 4.5 usando CallerMemberName
:
[SomethingCustom]
public string MyProperty { get; set; }
Luego, su atributo:
[AttributeUsage(AttributeTargets.Property)]
public class SomethingCustomAttribute : Attribute
{
public StartupArgumentAttribute([CallerMemberName] string propName = null)
{
// propName = "MyProperty"
}
}
- 1. Llamar a las funciones miembro desde un constructor
- 2. Prueba de atributos dentro del código de otros atributos
- 3. Pasando "esto" a una función desde dentro de un constructor?
- 4. Atributo Constructor Con Lambda
- 5. Obtener module.exports desde dentro del mismo archivo
- 6. Obtener iframe src param desde dentro del mismo iframe
- 7. Obtener atributo del elemento hijo
- 8. llamando a la función miembro de Javascript constructor
- 9. Valor predeterminado para el constructor de atributos?
- 10. ¿Por qué no se llama a los manejadores de atributos de Perl desde otros paquetes?
- 11. ¿Cómo averiguo a qué conjunto de cambios se aplicó una etiqueta en TFS?
- 12. Definición de métodos prototipo dentro del constructor
- 13. C++: ¿Se puede inicializar :: scoped_ptr dentro de un constructor?
- 14. Constructor no establece variable miembro
- 15. Atributos/variables miembro en interfaces?
- 16. Acceso a información de atributos del DTE
- 17. ¿Puedo aplicar un atributo a un miembro heredado?
- 18. Obtener el nombre de la propiedad dentro del atributo que se declaró en él
- 19. Agregando atributos a la entidad del cliente
- 20. ¿Cómo se usa el constructor no predeterminado para un miembro?
- 21. obtener el nombre del atributo además del valor del atributo en xml
- 22. Obtener el atributo DisplayAttribute desde PropertyInfo
- 23. Llamada de miembro virtual en el constructor
- 24. escapando dentro de la etiqueta html Valor del atributo
- 25. ¿Podemos utilizar este puntero dentro del constructor
- 26. Alcance de JavaScript: haciendo referencia al miembro de objeto primario desde el cierre del miembro secundario
- 27. ¿Puede un miembro struct ser zero-init desde la lista de inicializadores del constructor sin llamar a memset?
- 28. Orden del miembro constructor y llamadas al destructor
- 29. Cambiar el parámetro de propiedad desde dentro del constructor de clase [Python/Rasgos]
- 30. ¿cómo se pueden obtener los atributos del elemento raíz?
Puede describir brevemente el uso de los casos? – Tanmay
Si puede proporcionar más detalles sobre el problema que está resolviendo, es posible que pueda proporcionar una solución alternativa. –
Gracias, sé cómo puedo lograr lo mismo de una manera diferente, pero quería saber si esto era posible porque el código sería más limpio. – ryudice