我查看了有关委托的多个问题,我认为我有正确的语法,但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方法调用该方法。
答案 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;