如何通过名称动态添加事件

时间:2013-03-20 10:13:45

标签: c#

  

我有Delegate类型和function字符串格式。我怎么能添加   delegate中的那个功能?

数据表事件;

/* Having Records

Control Events      MethodName
ControlName     Validating      Leave       Enter
TextBox1        Textbox1_Validating TextBox1_Leave  --

*/

foreach(DataRow Row in Events.Rows)
{
    if (Row["Validating"].ToString() != "")
    {
//Here is I need a help that how can i add Textbox1_Validating event in 
//TextBox1.Validating
    }
}

3 个答案:

答案 0 :(得分:2)

一些天真的实现是在从lambda调用MethodIndo时使用另一级间接,并将其分配给类型为Func<int, string>的委托实例。请注意,存在更复杂的委托转换:

void Main()
{
    string methodName = "SomeMethod";

    var methodInfo = this.GetType().GetMethod(methodName);

    Action<string> myFunc = str => methodInfo.Invoke(this, new object[]{str});

    MyEvent += myFunc;

    MyEvent("value");

}
public event Action<string> MyEvent = delegate{}; 
                                    //default so that not to check for null

public void SomeMethod(string val)
{
    Console.WriteLine ("event called with: " + val);
}

打印

event called with: value

考虑关于此主题的另一个articles。很难说出你想要实现的目标,但我认为你可以将这个实现作为一个起点。

答案 1 :(得分:0)

委托是一种安全封装方法的类型,类似于C和C ++中的函数指针。与C函数指针不同,委托是对象

有关详细信息,请参阅msdn

答案 2 :(得分:0)

您可以使用其中一个Delegate.CreateDelegate重载来实现此目的。但是你需要知道目标对象(对象,它包含你想要在事件引发时调用的方法)

示例(伪代码):

public void TextBox1_Validating(object sender, CancelEventArgs args)
{
    // handle the event
}


public void RegisterEvent()
{
    CancelEventHandler handler = (CancelEventHandler)Delegate.CreateDelegate(
        typeof(CancelEventHandler), 
        this,
        "TextBox1_Validating");
    textBox1.Validating += handler;
}

您还可以阅读此MSDN文章,其中介绍了其他一些方法:How to: Hook Up a Delegate Using Reflection