Tüm olayları belirli bir öznitelikle alıyorum ve bu olayları başka bir yönteme ekleyerek değiştirmek istiyorum.Bir etkinlikte atanan yöntemi nasıl değiştirebilirim?
var type = GetType();
var events = type.GetEvents().Where(e => e.GetCustomAttributes(typeof(ExecuteAttribute), false).Length > 0);
foreach (var e in events)
{
var fi = type.GetField(e.Name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField);
var d = (Delegate)fi.GetValue(this);
var methods = d.GetInvocationList();
foreach (var m in methods)
{
var args = e.EventHandlerType.GetMethod("Invoke").GetParameters().Select(p => Expression.Parameter(p.ParameterType, "p")).ToArray();
var body = m.Method.GetMethodBody();
/**
TODO:
Create a new method with the body of the previous
and add a call to another method
Remove current method
Add the new created method
**/
}
}
Temel olarak ne yorumda bulunuyorum. Etkinliğin abone edilmiş yöntemlerini "değiştir". Sanırım buna abone olamam, çünkü yöntemin büyük işleyiciye (yeni yöntem) geçtiği parametreleri geçmem gerekiyor.
Bir örnek daha temel alan on this question.
var e += (x) =>
{
var y = x;
BigHandler(x); // injected code
};
Ya da bu:
var e += (x) => // new method
{
previousE(x); // previous method
BigHandler(x); // additional code
}
Bunu nasıl yapabilirim böyle bir şey için
var e += (x) =>
{
var y = x;
};
: Ben bu dönüştürmek istediğiniz?
büyük hedef:
Ben Bir olay ateşlendiğinde "algılamak" ve bir yöntemi çağırmanız gerekir. Kullanmakta olduğu parametreleri de göndermem gerek.
public delegate void OnPostSaved(Post p);
[Execute]
public event OnPostSaved PostSaved;
public void Save()
{
/* save stuff */
// assume that there is already an event subscribed
PostSaved(post);
}
Sonra işleyicisi yöntemi ben
XYZ
gelen bir olay kovuldu eğer kovuldu hangi olay kontrol kontrol parametresini almak ve bir şeyler yapabilir:
Yani böyle bir şey yapabilirsiniz. Örneğin:
public void BigHandler(string eventName, params object[] p)
{
if (eventName == "PostSaved")
{
var post = p[0] as Post;
MessageBoard.Save("User posted on the blog: " + post.Content);
}
}
Ben PostSharp
kullanılarak elde edilebilir biliyorum ama bunu kullanamazsınız. Başka bir çözüme ihtiyacım var.
İlgili Bir çözüm ne fazla bilgi üzerinde bulamadık 2010-09-27
- C# Reflection, changing a method's body
- How can I dynamically inject code into event handlers in Delphi?
Güncelleme Hala yardıma ihtiyacım var. +150 lütuf eklendi.
"Daha büyük hedefi" ekledim. Şu anki cevabınız yakın, özür dilerim ki, abone olmakta olan metodları almam gerektiğini söylemeyi unutmuşum. Daha fazla bilgi ekledim ... – BrunoLM
@BrunoLM: Bu sadece uygun delege oluşturma meselesi. Şimdi dışarı çıkıyorum, ama o zamana kadar çözmediyseniz yaklaşık bir saat sonra bakacağım. Lambda ifadeleri senin arkadaşın olabilir. –
@Jon Skeet: Hala anlamadım ... Olayın kullandığı nesneyi nasıl alabilirim? Düşünebilmemin tek yolu, aynı yöntemi değiştirmek. BigHandler (eventName, params_from_the_event.ToArray