特定の属性をマークしたすべてのプロパティを取得します


80

そこにクラスとプロパティがあります。一部のプロパティは属性としてマークできます(これは私のLocalizedDisplayName継承元ですDisplayNameAttribute)。これは、クラスのすべてのプロパティを取得するためのメソッドです。

private void FillAttribute()
{
    Type type = typeof (NormDoc);
    PropertyInfo[] propertyInfos = type.GetProperties();
    foreach (var propertyInfo in propertyInfos)
    {
        ...
    }
}

リストボックスLocalizedDisplayNameに属性の値をマークして表示するクラスのプロパティをリストボックスに追加したいと思います。これどうやってするの?

編集
これはLocalizedDisplayNameAttributeです:

public class LocalizedDisplayNameAttribute : DisplayNameAttribute
    {
        public LocalizedDisplayNameAttribute(string resourceId)
            : base(GetMessageFromResource(resourceId))
        { }

        private static string GetMessageFromResource(string resourceId)
        {
            var test =Thread.CurrentThread.CurrentCulture;
            ResourceManager manager = new ResourceManager("EArchive.Data.Resources.DataResource", Assembly.GetExecutingAssembly());
            return manager.GetString(resourceId);
        }
    }  

リソースファイルから文字列を取得したい。ありがとう。


「属性の値」とは何ですか?属性はクラスであり、多くの「値」(プロパティ/フィールド)を持つことができます。多分あなたはからの結果について話しているのToString()ですか?質問を編集して、適用するカスタム属性のコードを追加し、必要なデータを指定できますか?
マーリンモーガン-グラハム

回答:


132

おそらく最も使いやすいIsDefinedです:

var properties = type.GetProperties()
    .Where(prop => prop.IsDefined(typeof(LocalizedDisplayNameAttribute), false));

値自体を取得するには、次を使用します。

var attributes = (LocalizedDisplayNameAttribute[]) 
      prop.GetCustomAttributes(typeof(LocalizedDisplayNameAttribute), false);

7
+1; ちょっとした選択:IEnumerable<PropertyInfo>ここで指定します:)この回答を見た人がLinqまたはReflectionsに精通していない場合に役立ちます。
マーリンモーガン-グラハム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.