14

私は次のような状況にあります:

enum Header
{
    Sync,
    [OldProtocol] Keepalive,
    Ping,
    [OldProtocol] Auth,
    [OldProtocol] LoginData
    //...
}

OldProtocolAttributeが定義されている要素の配列を取得する必要があります。Attribute.IsDefined()メソッドとそのオーバーロードがこの種の状況をサポートしていないように見えることに気づきました。

私の質問は:

  • ソリューションのどの部分でも使用せずに問題を解決する方法はありますtypeof(Header).GetField()か?
  • そうでない場合、それを解決するための最も最適な方法は何ですか?
4

2 に答える 2

26

私の知る限り、フィールドから属性を取得する必要があります。使用するもの:

var field = typeof(Header).GetField(value.ToString());
var old = field.IsDefined(typeof(OldProtocolAttribute), false);

または、配列全体を取得するには:

var attributeType = typeof(OldProtocolAttribute);
var array = typeof(Header).GetFields(BindingFlags.Public |
                                     BindingFlags.Static)
                          .Where(field => field.IsDefined(attributeType, false))
                          .Select(field => (Header) field.GetValue(null))
                          .ToArray();

明らかに、これが頻繁に必要な場合は、結果をキャッシュすることをお勧めします。

于 2012-01-07T17:03:53.503 に答える
5

リフレクションは、これに使用できる唯一のツールです。ただし、クエリはそれほど悪くはありません。

var oldFields = typeof(Header).GetFields(BindingFlags.Static | BindingFlags.Public).Select(field => Attribute.IsDefined(field, typeof(OldProtocolAttribute)));
于 2012-01-07T17:12:42.327 に答える