反射C#从列表中获取自定义属性<t> </t>

时间:2012-11-27 20:02:48

标签: c# asp.net-mvc-3 reflection

我想从Model实现动态WebGrid创建。

想法是通过使用属性注释模型属性从模型“描述”创建网格。

class Model
{
   public List<Product> Products {get;set;}

}

class Product 
{
   [GridColumn]
   public String Name {get;set;}
   ....

}

然后我想通过反射获取所有属性标记的属性。

public WebGridColumns[] ColumnsFromModel(object model)
{
   // Here model is List<T> so how get all custom attributes of List<T> ?


}

1 个答案:

答案 0 :(得分:2)

您可以创建一个简单的扩展方法,它将从ICustomAttributeProvider interface的实现中获取您想要的属性(由可以在其上具有属性的.NET构造的任何表示形式实现):

public static IEnumerable<T> GetCustomAttributes(
    this ICustomAttributeProvider provider, bool inherit) where T : Attribute
{
    // Validate parameters.
    if (provider == null) throw new ArgumentNullException("provider");

    // Get custom attributes.
    return provider.GetCustomAttributes(typeof(T), inherit).
        Cast<T>();
}

从那里,它是对类型上所有PropertyInfo个实例的调用,如下所示:

var attributes = 
    // Get all public properties, you might want to
    // call a more specific overload based on your needs.
    from p in obj.GetType().GetProperties()

    // Get the attribute.
    let attribute = p.GetCustomAttributes<GridColumnAttribute>().
        // Assuming allow multiple is false.
        SingleOrDefault().

    // Filter out null properties.
    where attribute != null

    // Map property with attribute.
    select new { Property = p, Attribute = attribute };

从那里,您可以在任何对象实例上调用GetType method并通过上述查询运行它以获取PropertyInfo实例以及应用于该实例的属性。