-4

我有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
    }
}
4

3 回答 3

2

一些天真的实现是在从 lambda 调用时使用另一个级别的间接MethodIndo并将其分配给 type 的委托实例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

考虑有关此主题的另一篇文章。很难说你想要实现什么,但我认为你可以使用这个实现作为起点。

于 2013-03-20T10:22:05.177 回答
0

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

有关更多信息,您可以参考msdn

于 2013-03-20T10:23:30.277 回答
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 文章,其中展示了其他一些方法:如何:使用反射连接委托

于 2013-03-20T10:36:02.013 回答