【发布时间】:2010-09-24 13:16:18
【问题描述】:
我正在获取具有特定属性的所有事件,并且我想修改这些事件,添加对另一个方法的调用。
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
**/
}
}
我想要的基本上就是上面评论的。 “修改”事件的订阅方法。我想我不能订阅它,因为我需要将方法正在传递的参数传递给大处理程序(新方法)。
另一个基于on this question 的示例。我想转换这个:
var e += (x) =>
{
var y = x;
};
这样的:
var e += (x) =>
{
var y = x;
BigHandler(x); // injected code
};
或者这个:
var e += (x) => // new method
{
previousE(x); // previous method
BigHandler(x); // additional code
}
我该怎么做?
更大的目标:
我需要“检测”何时触发事件并调用方法。我还需要发送它使用的参数。
所以我可以制作类似的东西:
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);
}
然后在我的处理程序方法上,我可以检查来自XYZ 的事件是否被触发,检查哪个事件被触发,检索参数并执行某些操作。例如:
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);
}
}
我知道使用PostSharp 可以实现,但我不能使用它。我需要另一个解决方案。
相关
- C# Reflection, changing a method's body
- How can I dynamically inject code into event handlers in Delphi?
2010-09-27 更新我找不到解决方案,也没有更多信息,我仍然需要帮助。添加了 +150 赏金。
【问题讨论】:
标签: c# .net reflection