我创建了一个委托,我想将委托用作方法参数列表中的参数。我想调用处理程序就像我在Main方法中完美地工作一样。
问题:如何将委托传递给方法?
代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
public delegate void Del(string e);
Del handler = DelegateMethod;
public static void DelegateMethod(string message)
{
System.Console.WriteLine(message);
System.Console.ReadKey();
}
public void testDel(Del d) <--Write Here!!!
{
d.handler("33");
}
static void Main(string[] args)
{
// Instantiate the delegate.
// Del handler = DelegateMethod;
Program p = new Program();
p.handler("Hello World"); <--Like this example here (these work)
p.handler("DisneyLand");
p.handler("Cattle Wars");
testDel(p.handler("Cattle Wars");
}
}
}
错误列表:
Error 1 The best overloaded method match for 'ConsoleApplication1.Program.testDel(ConsoleApplication1.Program.Del)' has some invalid arguments C:\Users\itpr13266\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs 36 12 ConsoleApplication1
Error 2 Argument 1: cannot convert from 'void' to 'ConsoleApplication1.Program.Del' C:\Users\itpr13266\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs 36 20 ConsoleApplication1
Error 3 ) expected C:\Users\itpr13266\AppData\Local\Temporary Projects\ConsoleApplication1\Program.cs 36 44 ConsoleApplication1
工作代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
public delegate void Del(string e);
Del handler = DelegateMethod;
public static void DelegateMethod(string message)
{
System.Console.WriteLine(message);
System.Console.ReadKey();
}
public void testDel(Del d)
{
d.Invoke("L");
}
static void Main(string[] args)
{
// Instantiate the delegate.
// Del handler = DelegateMethod;
Program p = new Program();
p.handler("Hello World");
p.handler("DisneyLand");
p.handler("Cattle Wars");
p.testDel(p.handler);
}
}
}
答案 0 :(得分:6)
在第
行testDel(p.handler("Cattle Wars"));
调用 p.handler
。 Del
不再传递testDel
。也许你在寻找:
testDel(p.handler);
这会传递Del
,以便testDel
可以调用它。
答案 1 :(得分:1)
您必须将代理传递给方法而不使用“牛战争”参数
testDel(p.handler);
然后你的方法应如下所示。
public void testDel(Del d)
{
d.Invoke("L");
}
我将不得不说代表们对我来说仍然很奇怪。我知道它们只是类型安全且线程安全的变量。您可以像调用方法名一样使用变量。
public delegate void Del(string e);
Del handler = DelegateMethod;
在您的示例中,您的委托可以设置为任何返回类型为 void 的方法,并接受一个字符串参数。
Del handler = DelegateMethod;
以上是您声明委托的地方,但您也可以将委托声明为除了void和一个参数之外的任何方法作为字符串。
handler = BaseBall;
public void BaseBall(string a)
{
//code here
}
我会继续读你会随时学习。