我可以使用其他类的函数作为委托吗?

时间:2010-11-15 16:53:25

标签: c#

假设我有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的这个指针怎么样?

5 个答案:

答案 0 :(得分:6)

这只是一个语法问题;在classB.TheFunction之后删除括号 - 它们表示你希望调用方法。

DelegateCaller(new delFunction(classB.TheFunction));

请注意,方法组中存在隐式转换,因此您可以执行以下操作:

DelegateCaller(classB.TheFunction);

另请注意,在这种情况下创建自己的委托类型是不必要的;你可以使用内置的Func<string>类型。

编辑:正如Darin Dimitrov指出的那样,调用实例方法也是一个无关的问题,好像它是一个静态方法。

答案 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!!!";
    }
}

让我详细说明我对您的初始代码所做的不同更改:

    B类中的
  1. TheFunction需要公开,以便您可以从A类访问它
  2. 如果要从静态DelegateCaller方法调用它,则类A中的Main方法应该是静态的,并且不一定返回值(将其声明为void)。
  3. 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的函数。