0

そこで、熱心に System.ComponentModel.DataAnnotations 名前空間をモデルに追加しました。

次のようなものを追加しました。

[Required] [DisplayName("First Name")]
public string first_name {get;set;}

カスタム T4 を記述したり、ビューを大幅に変更したりする必要がなくなるため、これらの属性が非常に気に入っています。このようにして、必要な表示名などを追加することを確信してビューを再生成できます。

この問題は、ASP.NET MVC2 で解き放たれたものに触発された DataGrid ヘルパーの構築を開始したときに発生しました。

このヘルパーでは、Stephen はリフレクションを使用して列見出しを取得します。

var value=typeOf(T).GetProperty(columnName).GetValue(item,null) ?? String.Empty;

問題は、プロパティ名を取得したくないことです。DisplayName 属性の値を取得したいと考えています。

これに対する最初の試みは、PropertyInfo クラスの Attributes プロパティの内部を調べることでした。残念ながら、データ注釈は属性として表示されません。

リフレクションを使用してデータ注釈を取得する方法はありますか?

ありがとう、

ロン

4

2 に答える 2

0
var attributes = (DisplayNameAttribute[])typeof(T)
    .GetProperty(columnName)
    .GetCustomAttributes(typeof(DisplayNameAttribute), true);

// TODO: check for null and array size
var displayName = attributes[0].DisplayName;
于 2010-02-03T08:25:10.593 に答える
0
public static void BuildGrid<T>(IEnumerable<T> items)
    {            
        var metadataTypes = typeof(T).GetCustomAttributes(typeof(MetadataTypeAttribute), true);
        if (metadataTypes.Any())
        {
            foreach (var metaProp in (metadataTypes[0] as MetadataTypeAttribute).MetadataClassType.GetProperties())
            {
                var objProp = typeof(T).GetProperties().Single(x => x.Name == metaProp.Name);
                var displayNames = metaProp.GetCustomAttributes(typeof (DisplayNameAttribute), true);
                if (displayNames.Any())
                {
                    var displayName = (displayNames[0] as DisplayNameAttribute).DisplayName;                        
                    foreach (var item in items)
                        var value = objProp.GetValue(item, null);                            
                }
            }                
        }
    }
于 2010-08-11T07:59:40.703 に答える