2010-02-19 5 views
11

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?

+0

Puede describir brevemente el uso de los casos? – Tanmay

+1

Si puede proporcionar más detalles sobre el problema que está resolviendo, es posible que pueda proporcionar una solución alternativa. –

+1

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

Respuesta

13

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.

+0

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 –

0

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" 
     }; 
    } 
} 
0

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" 
    } 
} 
Cuestiones relacionadas