2012-01-30 8 views
5

背後に生成されたフィールドの属性を検査、私はイベントの属性を参照してくださいしたいと思います。次のクラス定義</p> <pre><code>public class MyClass { [System.ComponentModel.Browsable(true)] [field:NonSerialized] public event EventHandler MyEvent; } </code></pre> <p>に他の私のコードのどこかを考える場のようなイベント

var attributes = typeof(MyClass) 
        .GetEvents() 
        .SelectMany(n => n.GetCustomAttributes(true)); 

しかし、私はその属性コレクションでBrowsableAttributeしか見ていません。

field:NonSerialized属性情報はどのように入手できますか?

+1

適切な 'BindingFlags'を指定した' GetFields'はあなたにすべてのフィールドを渡しますが、さらに*始める*情報とあなたが*取得しようとしている情報を知る必要があります。 「各フィールドのようなイベントについて、そのイベントの背後にあるフィールドの属性を教えてください」と言うことができるようにしたいですか?あるいは、「生成されたものも含めて、 'NonSerialized'フィールドはありますか?足ります?または...? – AakashM

答えて

2

field:という構文は、(このフィールドをサポートするために)コンパイラによって生成されたフィールドに属性が付加されていることを意味します。実装の詳細なのでEventInfoの一部ではないので(イベントはフィールドで具体的にバックアップする必要はないため、プロキシできるか、EventHandlerListなど)、このフィールドの名前を知ることはできません。 。

このレベルの情報が必要な場合は、(図のように「フィールドライクなイベント」ではなく)手動でイベントを実装することができます。実際にはこれを知る必要はまれです。この情報はであり、実際にはであり、必要なのはBinaryFormatterなどであり、「手を離した」と言うだけです。

もう1つの方法はGetFields()を使用することですが、フィールドをイベントにマッピングする強力な方法は存在しません。

関連する問題

 関連する問題