var events = GetType().GetEvents();
ifadesi geçerli türle ilişkilendirilmiş EventInfo
nesnelerinin listesini sunar; geçerli örnek başına değil. Bu nedenle, EventInfo
nesnesi, geçerli örnekle ilgili bilgi içermez ve dolayısıyla kablolu delege hakkında bilgi sahibi olmaz.
İstediğiniz bilgileri almak için, geçerli örneğinizdeki olay işleyicisinin destek alanını almanız gerekir. Yani şimdi çağıran kod şöyle olabilir
public class MyClass
{
public event EventHandler MyEvent;
public IEnumerable<MethodInfo> GetSubscribedMethods()
{
Func<EventInfo, FieldInfo> ei2fi =
ei => this.GetType().GetField(ei.Name,
BindingFlags.NonPublic |
BindingFlags.Instance |
BindingFlags.GetField);
return from eventInfo in this.GetType().GetEvents()
let eventFieldInfo = ei2fi(eventInfo)
let eventFieldValue =
(System.Delegate)eventFieldInfo.GetValue(this)
from subscribedDelegate in eventFieldValue.GetInvocationList()
select subscribedDelegate.Method;
}
}
: İşte nasıl
class GetSubscribedMethodsExample
{
public static void Execute()
{
var instance = new MyClass();
instance.MyEvent += new EventHandler(MyHandler);
instance.MyEvent += (s, e) => { };
instance.GetSubscribedMethods()
.Run(h => Console.WriteLine(h.Name));
}
static void MyHandler(object sender, EventArgs e)
{
throw new NotImplementedException();
}
}
yukarıdaki çıktısı şu şekildedir:
MyHandler
<Execute>b__0
Sana etrafında jig eminim Eğer metod bilgisinden ziyade delege geri dönmek isterseniz, bu kod size yardımcı olacaktır.
Umarım bu yardımcı olur.
Benzer
önceki soru üzerine en yüksek oyu cevap alıntı: "Şimdi diyelim ki bu olabilir cesedini bulmaya 'add' işleyici koda ve olay işleyicileri olmak nasıl iş dışarı saklanır ve onları bu şekilde alırsınız ... ** ama lütfen yapma ** Çok kapsayıcılığı kırmak için çok fazla iş yaratıyorsunuz sadece kodunuzu yeniden tasarlamak ** Bunu yap." Bütün kalbimle katılıyorum. –