从属性构造函数中获取应用了哪个属性的成员?

时间:2010-02-19 20:06:49

标签: c# .net reflection attributes

我有一个自定义属性,在我的自定义属性的构造函数中我想将my属性的属性值设置为我的属性所应用的属性的类型,是否有某种方式访问​​该属性的成员是从我的属性类里面应用的吗?

3 个答案:

答案 0 :(得分:15)

我担心属性不会这样。它们只是“标记”,附着在物体上,但无法与它们相互作用。

属性本身通常应该没有行为,只是包含它们所附加类型的元数据。与属性关联的任何行为都应由另一个查找属性存在并执行任务的类提供。

如果您对应用该属性的类型感兴趣,那么该信息将在您反映获取属性的同时可用。

答案 1 :(得分:9)

可以使用CallerMemberName

。NET 4.5
[SomethingCustom]
public string MyProperty { get; set; }

然后你的属性:

[AttributeUsage(AttributeTargets.Property)]
public class SomethingCustomAttribute : Attribute
{
    public StartupArgumentAttribute([CallerMemberName] string propName = null)
    {
        // propName = "MyProperty"
    }
}

答案 2 :(得分:0)

你可以做下一步。这是一个简单的例子。

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