【问题标题】:Getting custom attributes that were set outside the class获取在类外设置的自定义属性
【发布时间】:2009-09-01 09:30:46
【问题描述】:

假设我有一个名为 Data 的类。 另一个类用一些属性注释它的一个成员,类型为 data。 例如:

public class Example{

    [DefaultNameAttribute("default name")]
    public Data Name{get;set}
}

我正在寻找的是一种从类 Data 中检索该属性及其包含的数据的方法。我希望能够编写以下代码:

public class Data{
    private string _name = null;
    public string Name{
        get{
            if (_name != null) return _name;
            return (getDefaultNameFromAnnotation(this));//this is the method I'm looking for
        }
}

换句话说,我希望能够使用在我的类之外指定的自定义属性为特定字段提供默认值。

【问题讨论】:

    标签: c# attributes annotations


    【解决方案1】:

    简答:你不能,或者至少你不应该。

    DefaultNameAttribute 应用于Example 类型的成员,该成员与Data 类型去相关。可能有几种类型使用Data 类型,以及DefaultNameAttribute 的几个实例。 Example 甚至可以在另一个程序集中定义,等等。

    【讨论】:

      【解决方案2】:

      这将取决于您的属性是如何使用的(如果它是在类、属性、方法等上)。例如,如果它仅用于一个类,您可以使用以下代码获取所有用您的属性标记的类型:

      public IEnumerable<Type> GetTypes(Assembly assembly) 
      {
          foreach(Type type in assembly.GetTypes()) 
          {
              if (type.GetCustomAttributes(typeof(DefaultNameAttribute), true).Length > 0) 
              {
                  yield return type;
              }
          }
      }
      

      如果它仅用于属性(如您的示例),那么您可以嵌套一个额外的 foreach 语句,该语句将枚举给定类型的所有属性并查找属性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-21
        • 1970-01-01
        • 2017-03-28
        • 2021-07-08
        相关资源
        最近更新 更多