【问题标题】:Retrieve custom attribute parameter values?检索自定义属性参数值?
【发布时间】:2011-04-24 22:50:06
【问题描述】:

如果我创建了一个属性:

public class TableAttribute : Attribute {
    public string HeaderText { get; set; }
}

我将它应用于我在一个类中的一些属性

public class Person {
    [Table(HeaderText="F. Name")]
    public string FirstName { get; set; }
}

在我看来,我有一个我在表格中显示的人员列表。我如何检索 HeaderText 的值以用作我的列标题?比如……

<th><%:HeaderText%></th>

【问题讨论】:

    标签: c# custom-attributes


    【解决方案1】:

    在这种情况下,您首先要检索相关的PropertyInfo,然后调用MemberInfo.GetCustomAttributes(传入您的属性类型)。将结果转换为您的属性类型的数组,然后照常获取HeaderText 属性。示例代码:

    using System;
    using System.Reflection;
    
    [AttributeUsage(AttributeTargets.Property)]
    public class TableAttribute : Attribute
    {
        public string HeaderText { get; set; }
    }
    
    public class Person
    {
        [Table(HeaderText="F. Name")]
        public string FirstName { get; set; }
    
        [Table(HeaderText="L. Name")]
        public string LastName { get; set; }
    }
    
    public class Test 
    {
        public static void Main()
        {
            foreach (var prop in typeof(Person).GetProperties())
            {
                var attrs = (TableAttribute[]) prop.GetCustomAttributes
                    (typeof(TableAttribute), false);
                foreach (var attr in attrs)
                {
                    Console.WriteLine("{0}: {1}", prop.Name, attr.HeaderText);
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果您允许在一个属性上声明多个相同类型的属性,Jon Skeet 的解决方案就很好。 (AllowMultiple = true)

      例如:

      [Table(HeaderText="F. Name 1")]
      [Table(HeaderText="F. Name 2")]
      [Table(HeaderText="F. Name 3")]
      public string FirstName { get; set; }
      

      在您的情况下,我假设您只希望每个属性允许一个属性。在这种情况下,您可以通过以下方式访问自定义属性的属性:

      var tableAttribute= propertyInfo.GetCustomAttribute<TableAttribute>();
      Console.Write(tableAttribute.HeaderText);
      // Outputs "F. Name" when accessing FirstName
      // Outputs "L. Name" when accessing LastName
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-05
        • 2015-12-17
        • 1970-01-01
        • 2011-09-12
        相关资源
        最近更新 更多