C#代表和全局范围

时间:2015-12-29 05:49:33

标签: c# delegates global

我是C#代表的新手,我试图创建一个适合他们的简单类。我希望类的实例能够将函数作为参数,将其存储在委托中,然后在外部源提示时调用该委托。类似的东西:

class UsesDelegates {

    private delegate void my_delegate_type();
    private my_delegate_type del;

    public void GetDelegate ( /*Not sure what goes here*/ ) {...}
    public void CallDelegate () {
         del();
    }
}

我遇到的问题是,由于my_delegate_type是类的内部,因此无法在类外部构造它以将其传递给GetDelegate()。我希望我能够将函数名称(可能作为字符串)传递给GetDelegate(),以便委托可以在方法中构建,但我找不到这样做的方法。我意识到我能够使my_delegate_type全局并在此类之外构造委托,但将类型设为全局似乎是不合适的,因为它仅由UsesDelegates使用。有没有办法保持类型封装,同时仍然实现所需的功能?

1 个答案:

答案 0 :(得分:2)

您需要使用Action代替delegate,就像这样。

public class UsesDelegates
{
    private Action action;

    public void GetDelegate(Action action) => this.action = action;
    public void CallDelegate() => del();
}

然后您可以使用它,如下所示:

class Program
{
    static void Main(string[] args)
    {
        UsesDelegates usesDelegates = new UsesDelegates();
        usesDelegates.GetDelegate(Console.WriteLine);
        usesDelegates.CallDelegate();
    }
}

Action支持参数,方法是传递类型:Action<p1, p2>,如果需要返回类型,则可以使用Func<return, p1, p2>