我想从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> ?
}
答案 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
实例以及应用于该实例的属性。