1

モデルからの動的 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> ?


}
4

1 に答える 1

2

ICustomAttributeProviderインターフェイスの実装から必要な属性を取得する単純な拡張メソッドを作成できます(これは、属性を持つことができる.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メソッドを呼び出し、上記のクエリを実行して、PropertyInfoインスタンスとそれに適用される属性を取得できます。

于 2012-11-27T20:29:46.147 に答える