わかりました、ここに投稿しようとしたときにこれを解決しました。どちらも 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 を追加しない理由を知っている人がいる場合は、これを投稿することにしました。将来変更される可能性のあるバッキング フィールドの命名規則に依存しない方法を知りたいです。