propiedades - programar c#
¿Obtener miembro a qué atributo se aplicó desde dentro del constructor de atributos? (3)
Tengo un atributo personalizado, dentro del constructor de mi atributo personalizado. Deseo establecer el valor de una propiedad de mi atributo para el tipo de la propiedad a la que se aplicó mi atributo. De alguna manera, tengo acceso al miembro al que se aplicó el atributo. desde dentro de mi clase de atributo?
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 vinculados. 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.
Puedes hacer luego. 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 desde .NET 4.5 utilizando CallerMemberName
:
[SomethingCustom]
public string MyProperty { get; set; }
Entonces tu atributo:
[AttributeUsage(AttributeTargets.Property)]
public class SomethingCustomAttribute : Attribute
{
public StartupArgumentAttribute([CallerMemberName] string propName = null)
{
// propName = "MyProperty"
}
}