假设我有2个类,A类和B类.A类创建一个B类实例.A类有一个函数,我想从B类传递给一个方法。
class A {
void Main(string[] args) {
B classB=new B();
DelegateCaller(new delFunction(classB.TheFunction()); // <-- Won't compile (method name expected)
DelegateCaller(new delFunction(B.TheFunction()); // <-- Won't compile (object reference is req'd)
}
public delegate string delFunction();
public DelegateCaller(delFunction func) {
System.Console.WriteLine(func());
}
}
class B {
public string TheFunction() {
return "I'm Printing!!!";
}
}
我不确定它是否是语法问题,或者它只是我不能做的事情。也许我需要在B中定义委托,但在A中引用它? B的这个指针怎么样?
答案 0 :(得分:6)
这只是一个语法问题;在classB.TheFunction
之后删除括号 - 它们表示你希望调用方法。
DelegateCaller(new delFunction(classB.TheFunction));
请注意,方法组中存在隐式转换,因此您可以执行以下操作:
DelegateCaller(classB.TheFunction);
另请注意,在这种情况下创建自己的委托类型是不必要的;你可以使用内置的Func<string>
类型。
答案 1 :(得分:3)
试试这样:
class A
{
static void Main()
{
B classB = new B();
DelegateCaller(classB.TheFunction);
}
public delegate string delFunction();
public static void DelegateCaller(delFunction func)
{
Console.WriteLine(func());
}
}
class B
{
public string TheFunction()
{
return "I'm Printing!!!";
}
}
让我详细说明我对您的初始代码所做的不同更改:
TheFunction
需要公开,以便您可以从A类访问它DelegateCaller
方法调用它,则类A中的Main
方法应该是静态的,并且不一定返回值(将其声明为void)。delFunction
委托的定义应该返回一个字符串。答案 2 :(得分:1)
在TheFunction的末尾取括号。您需要方法,而不是调用方法的结果。
答案 3 :(得分:1)
如果要以通用方式捕获实例方法以供使用,则应使用Delegate.CreateDelegate(Type,MethodInfo)
。这很好,因为它允许您创建“开放委托”,这意味着它不绑定到实例,并且可以采用任何ClassB
的实例。如果您知道类型信息,它会使反射速度非常快,因为此方法的执行速度比使用MethodInfo.Invoke
的等效语句快得多。
答案 4 :(得分:0)
DelegateCaller(new delFunction(B.TheFunction());
应该是
DelegateCaller(new delFunction(B.TheFunction);
使用classB.TheFunction,你需要使TheFunction静态。你传递了没有parens的函数。