如何通过反射将参数传递给方法

Posted

技术标签:

【中文标题】如何通过反射将参数传递给方法【英文标题】:How to pass parameters to a method by reflection 【发布时间】:2010-11-30 16:19:19 【问题描述】:

除了my precedent question,我想将参数传递给方法“WriteTrace”。但我不知道该怎么做。

这里是实际代码:

public class Trace

    public void WriteTrace(object sender, EventArgs e)
    
        Console.WriteLine("Trace !");
    




public void SubscribeEvent(Control control)

    if (typeof(Control).IsAssignableFrom(control.GetType()))
    
        Trace test = this;
        MethodInfo method = typeof(Trace).GetMethod("WriteTrace");

        EventInfo eventInfo = control.GetType().GetEvent("Load");

        // Create the delegate on the test class because that's where the
        // method is. This corresponds with `new EventHandler(test.WriteTrace)`.
        Delegate handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, test, method);
        // Assign the eventhandler. This corresponds with `control.Load += ...`.
        eventInfo.AddEventHandler(control, handler);
    

现在我想在跟踪中获取一些信息:

控件的名称

活动名称

public void WriteTrace(object sender, EventArgs e)

    Console.WriteLine("Control : " + e.ControlName + "Event : " + e.EventName);

我是否使用这些信息创建一个派生自 EventArgs 的类 TraceEventArgs ? 如何在方法 SubscribeEvent 中传递这些信息?

感谢您的帮助,

弗洛里安

编辑

抱歉,这里引用“我以前的问题”:Subscribe to an event with Reflection

【问题讨论】:

【参考方案1】:

试试这样的:

public void WriteTrace(object sender, EventArgs e, string eventName)

    Control c = (Control)sender;
    Console.WriteLine("Control: " + f.Name + ", Event: " + eventName);


public void SubscribeEvent(Control control, string eventName) 
    EventInfo eInfo = control.GetType().GetEvent(eventName);

    if (eInfo != null) 
        // create a dummy, using a closure to capture the eventName parameter
        // this is to make use of the C# closure mechanism
        EventHandler dummyDelegate = (s, e) => WriteTrace(s, e, eventName);

        // Delegate.Method returns the MethodInfo for the delegated method
        Delegate realDelegate = Delegate.CreateDelegate(eInfo.EventHandlerType, dummyDelegate.Target, dummyDelegate.Method);

        eInfo.AddEventHandler(control, realDelegate);
    

【讨论】:

我忘记添加上一个问题的链接。我想传递的控件是一个表单(用于测试):“我希望这个类订阅一个事件,例如表单控件的加载事件。控件和事件是动态定义的,所以我想使用反射来做到这一点" 很抱歉造成混乱

以上是关于如何通过反射将参数传递给方法的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 JCL 将参数传递给 REXX 程序

java中,如何用POST方法将参数传递给第三方网站

通过javascript将参数传递给动作不会传递整数值

除了通过 main 的 argv 之外,还有其他方法可以将用户参数传递给程序吗?

如何将可选参数传递给 C++ 中的方法?

如何将参数传递给配置单元视图,以便视图根据传递的内容进行更改?