在C#中分配委托变量的语法

时间:2015-03-23 22:28:56

标签: c#

我查看了有关委托的多个问题,我认为我有正确的语法,但Visual 2012正在抛出错误:myMethod在当前上下文中不存在。

class Class1
{
    public delegate void DoSomething(List<dynamic> input);

    List<dynamic> myData = new List<dynamic>();
    Delegate myMethod;

    public void AssignData(List<dynamic> input)
    {
        myData.Clear();
        myData.AddRange(input);
    }

    public void AssignFunction(DoSomething method)
    {
        myMethod = method;
    }

    public void CheckDel()
    {
        myMethod(myData);
    }
}

}

这是调用代码似乎正常工作:

private void Form1_Load(object sender, EventArgs e)
    {
        List<dynamic> test = new List<dynamic>();
        test.Add(1);
        test.Add(2);
        test.Add(3);

        myClass.AssignData(test);
        myClass.AssignFunction(callBack);
        myClass.CheckDel();
    }
    public void callBack(List<dynamic> input)
    {

        MessageBox.Show(input[0].ToString());
    }

除了CheckDel函数返回上述错误外,其他一切似乎都很好。我希望能够使用AssignFunction随时分配方法。然后Class1可以使用CheckDel方法调用该方法。

2 个答案:

答案 0 :(得分:2)

当您的委托被声明为普通的Delegate对象时,您必须通过调用DynamicInvoke方法来调用它。

myMethod.DynamicInvoke(myData);

出于性能原因,最好将您的委托声明为您想要的特定类型。即代替Delegate myMethod;,您知道它是DoSomething,因此请使用DoSomething myMethod;

将其视为声明

的类比

object myObject; vs Class1 myObject; - 您需要将第一个投放到Class1,以便在其上调用任何Class1方法。

实际上,您可以将myMethod投射到DoSomething类型,它会按预期工作:
((DoSomething)myMethod)(myData);

答案 1 :(得分:-4)

//Delegate myMethod;
DoSomething myMethod;