0

わかりました、ここに投稿しようとしたときにこれを解決しました。どちらも add_testEvt1 remove_testEvt1 メソッドのペアになるため、リフレクションのようなものevent Action testEvt1;とリフレクションのあるものを区別する方法を探していました 。event Action testEvt1 { add { } remove { }}驚くべきことに、ここでは CompilerGeneratedAttribute は役に立ちません。

解決策は、イベントと同じ名前でファイルされたプライベート バッキングを探すことであることが判明しました。コンパイラは単純なイベントに対してのみ 1 つを生成し、同じ名前の他のフィールドを持つことはできません。

コードが示すように:

class Program
    {
        static void Main(string[] args)
        {
            EventInfo evt1 = typeof(a).GetEvent("testEvt1");
            EventInfo evt2 = typeof(a).GetEvent("testEvt2");

            var evt1Attrib = Attribute.GetCustomAttribute(evt1, typeof(CompilerGeneratedAttribute));
            var evt2Attrib = Attribute.GetCustomAttribute(evt2, typeof(CompilerGeneratedAttribute));

            var evt1Backfield = typeof(a).GetField(evt1.Name,BindingFlags.NonPublic | BindingFlags.Instance);
            var evt2Backfield = typeof(a).GetField(evt2.Name, BindingFlags.NonPublic | BindingFlags.Instance);
        }
    }

    public class a
    {
        //private Action testEvt1;
        public event Action testEvt1;
        public event Action testEvt2
        {
            add { }
            remove { }
        }
    }

evt1Attrib と evt2Attrib はどちらも null になります。ただし、バッキング ファイルは単純な testEvt1 に対してのみ見つかり、testEvt2 に対しては見つかりません。

他の誰かがたまたま同じ問題を抱えていて、testEvt1 と testEvt2 を区別する簡単な方法と、イベントのメソッドを追加および削除するためにコンパイラが CompilerGeneratedAttribute を追加しない理由を知っている人がいる場合は、これを投稿することにしました。将来変更される可能性のあるバッキング フィールドの命名規則に依存しない方法を知りたいです。

4

1 に答える 1

0

上記の回答。同じ名前のプライベート インスタンスまたは静的 (問題のイベントと同じ) バッキング フィールドを探す必要があります。

于 2013-07-12T16:34:49.597 に答える