2011-07-22 13 views
0

私は、単にクラスプロパティを '表示名'としてマークするカスタム属性を生成しました。私がしたいのは、自分の属性でマークされているクラス内のプロパティを見つけることです。私が知る限り、これを行うための唯一の方法は、(リフレクションを介して)各プロパティをループし、それが割り当てた属性をチェックすることです。これよりも簡単/早い方法がありますか?アトリビュートでマークされたクラスのすべてのプロパティを取得

foreach (PropertyInfo property in myClassProperties) 
{ 
    //Get the alias attributes. 
    object[] attr= 
    property.GetCustomAttributes(typeof(DisplayField), true); 

    if(attr.Count() > 0) 
    { 
    // This is a display field! 
    } 
} 

おかげ

+0

あなたは配列を持っているので、 'attr.Count()'ではなく 'attr.Length'を使うべきです。 – Lucero

答えて

4

まあ、それはあなたが欲しいものを見つけるために、すべての属性をチェックするよりも少し単純だ - あなたはそれがIsDefinedを使用して特定の属性を持っているかどうかを任意のメンバーに尋ねることができます。

var properties = type.GetProperties() 
        .Where(p => p.IsDefined(typeof(MyAttribute), false)); 

明らかにあなたがキャッシュすることができますあなたが複数回それを使うつもりならば、タイプごとに結果が出ます。

+0

ありがとう、それはよさそうだ – user460667

4

は、私の知る限りでは、私はこれを行うことができる唯一の方法は、(リフレクション経由)各プロパティをループしていると、それが割り当てられているどの属性を確認してください。

これはまさにそれを行う方法です。属性は、コンパイル時にアセンブリに焼き付けられるメタデータです。実行時にそれらにアクセスするにはReflectionが必要です。

0

私が気付いている唯一の方法は、辞書を静的にまたはシングルトンで作成することです。その結果、その後の訪問はより高速になります。私はこのキャッシングを時々行いますが、検索属性の機能について上記で概説したのとまったく同じです。

関連する問題