将回调传递给类

时间:2013-04-05 19:54:26

标签: c# delegates

我有一个类,我希望存储一个函数调用。此函数调用可以由类调用,但由父类设置。我想从外部提供要进行的调用,包括任何参数。

像...一样的东西。

public class TestDelegate
{
    public TestDelegate()
    {
        TestClass tc = new TestClass(DoSomething("blabla", 123, null));
    }

    private void DoSomething(string aString, int anInt, object somethingElse)
    {
        ...
    }
}

public class TestClass
{
    public TestClass(delegate method)
    {
        this.MethodToCall = method;
        this.MethodToCall.Execute();
    }

    public delegate MethodToCall { get; set; }
}

初始化TestClass类时,它将使用指定的参数调用父类的DoSomething方法。我还要提一下,我不想为所调用的方法要求相同的方法签名。意义并非总是(字符串,整数,对象)

2 个答案:

答案 0 :(得分:5)

使用Action委托类型并从闭包中创建一个这样的实例:

public class TestClass
{
    public TestClass(Action method)
    {
        MethodToCall = method;
        method();
    }

    public Action MethodToCall { get; set; }
}

public class TestDelegate
{
    public TestDelegate()
    {
        // Uses lambda syntax to create a closure that will be represented in
        // a delegate object and passed to the TestClass constructor.

        TestClass tc = new TestClass(() => DoSomething("blabla", 123, null));
    }

    private void DoSomething(string aString, int anInt, object somethingElse)
    {
        // ...
    }
}

答案 1 :(得分:3)

delegate不是类型的名称 - 它是用于声明委托类型的关键字,也是匿名方法。

我怀疑你实际上想要一个特定类型的委托,例如Action,它是一个没有参数和void返回类型的委托。然后,您还需要更改调用代码 - 因为在调用构造函数之前,您目前正在调用 DoSomething。样品:

public class TestDelegate
{
    public TestDelegate()
    {
        TestClass tc = new TestClass(() => DoSomething("blabla", 123, null));
    }

    private void DoSomething(string aString, int anInt, object somethingElse)
    {
        ...
    }
}

public class TestClass
{
    public TestClass(Action method)
    {
        this.MethodToCall = method;
        this.MethodToCall.Invoke();
    }

    // Do you really need this to be writable?
    public Action MethodToCall { get; set; }
}