获取属性描述属性

时间:2014-10-14 05:01:03

标签: c#

现有代码(简化)

我有这个功能

public static string[] GetFieldNames<T>(IEnumerable<T> items)
  where T : class
{
  var properties = typeof(T).GetProperties().Where(p => SystemTypes.Contains(p.PropertyType)); // Only get System types

  return properties.Select(p => p.Name).ToArray();
}

所以如果说我有这个课程

class MyClass {
  public string Name { get; set; }

  [Description("The value")]
  public int Value { get; set; }
}

我可以拥有这样的代码

List<MyClass> items = ...; // Populate items somehow
string[] fieldNames = GetFieldNames(items); // This returns ["Name", "Value"]

工作正常。

问题

我需要获取描述(如果存在),以便GetFieldNames(items)返回["Name", "The value"]

如何修改GetFieldNames()函数以读取描述属性(如果存在)? (请注意,此功能已经简化,实际功能要复杂得多,所以请避免更改逻辑)

5 个答案:

答案 0 :(得分:3)

这应该适合你:

return properties.Select(p => 
    Attribute.IsDefined(p, typeof(DescriptionAttribute)) ? 
        (Attribute.GetCustomAttribute(p, typeof(DescriptionAttribute)) as DescriptionAttribute).Description:
        p.Name
    ).ToArray();

答案 1 :(得分:3)

注意:只需添加using System.Reflection,因为GetCustomAttribute是.Net 4.5中的扩展方法

public static Tuple<string,string>[] GetFieldNames<T>(IEnumerable<T> items) where T : class
{
    var result =
        typeof (T).GetProperties()
            .Where(p => SystemTypes.Contains(p.PropertyType) &&p.GetCustomAttribute<DescriptionAttribute>() != null)
            .Select(
                p =>
                    new Tuple<string, string>(p.Name,
                        p.GetCustomAttribute<DescriptionAttribute>().Description));

    return result.ToArray();
}

对于早期版本的.Net框架,我们可以使用这种扩展方法:

public static class Extension
{
    public static T GetCustomAttribute<T>(this System.Reflection.MemberInfo mi) where T : Attribute
    {
        return mi.GetCustomAttributes(typeof (T),true).FirstOrDefault() as T;
    }
}

答案 2 :(得分:1)

这是您可以使用的通用函数,如果fieldName具有description标记属性,则返回该值,否则返回null

public string GetDescription<T>(string fieldName)
{
    string result;
    FieldInfo fi = typeof(T).GetField(fieldName.ToString());
    if (fi != null)
    {
        try
        {
            object[] descriptionAttrs = fi.GetCustomAttributes(typeof(DescriptionAttribute), false);
            DescriptionAttribute description = (DescriptionAttribute)descriptionAttrs[0];
            result = (description.Description);
        }
        catch
        {
            result = null;
        }
    }
    else
    {
        result = null;
    }

    return result;
}

示例:

class MyClass {
  public string Name { get; set; }

  [Description("The age description")]
  public int Age { get; set; }
}

string ageDescription = GetDescription<MyClass>("Age");
console.log(ageDescription) // OUTPUT: The age description

答案 3 :(得分:0)

使用GetCustomAttributes方法

    static void attributecheck()
    {
        var props = typeof(Product).GetProperties();
        foreach (var propertyInfo in props)
        {
            var att = propertyInfo.GetCustomAttributes(typeof(DescriptionAttribute), true);
            if (att.Length >0)
            {
            }
        }
    }

答案 4 :(得分:0)

我经常使用Description属性,因此我为此写了Nuget

有了它,您可以致电:

typeof(TestClass).GetPropertyDescription("PropertyName"); 

它还允许从类,字段,枚举和方法中提取DescriptionAttribute