【问题标题】:Consuming Custom Attributes使用自定义属性
【发布时间】:2010-12-05 03:39:26
【问题描述】:

看看下面的问题Real world use of custom .NET attributes你会如何实现@Esteban提出的解决方案?

我对代码执行的时间和地点感到有些困惑。您能否提供一个好的代码示例。

我以前问过这个问题,但没有正确表达我想是的......

【问题讨论】:

    标签: c# custom-attributes


    【解决方案1】:

    关于您引用的问题/答案,我假设会有一些代码在数据层或在进行验证的类本身中运行。该代码将对正在验证的对象使用反射来查找具有不同属性的属性,并在该属性上运行与该属性关联的特定验证逻辑。

    它可能看起来像下面这样:

     public void Validate( object obj )
     {
           foreach (var property in obj.GetType().GetProperties())
           {
                var attribute = property.GetCustomAttributes(typeof(ValidationAttribute), false);
                var validator = ValidationFactory.GetValidator( attribute );
                validator.Validate( property.GetValue( obj, null ) );
           }
     }
    

    【讨论】:

    • 好的,这很有意义。我以为我错过了一个关键要素,但事实证明我没有。当! :) 谢谢@tvanfosson
    【解决方案2】:

    在提交(保存)html 表单(win 表单)时,您会返回更改后的 Customer 类。对于每个属性,您检查它是否具有与之关联的自定义属性(从 ValidationAttribute 继承或实现 IValiador 接口或类似的东西)。对于每个这样的属性,您可以在属性值上调用属性的验证方法(创建适当的验证类并调用验证方法)。

    【讨论】:

      【解决方案3】:

      你会使用反射:

      public class MyClass
      {
           [Description("I'm an attribute!")]
           public int MyField;
      
           public Attribute GetAttribute(string fieldName)
           {
                FieldInfo field = typeof(MyClass).GetField("MyField");
                Attribute[] attributes = (Attribute[])field.GetCustomAttributes(typeof(Attribute), false);
      
                DescriptionAttribute desc = (DescriptionAttribute)attributes[0];
                return desc;
           }
      }
      

      如果属性成员是一个字段,您将使用FieldInfo,如示例中使用的那样。如果是属性,则使用PropertyInfoFieldInfoPropertyInfo 的成员几乎相同。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-26
        • 1970-01-01
        • 1970-01-01
        • 2011-03-27
        相关资源
        最近更新 更多