使用Action而不是Func

本文关键字:Func Action 使用 | 更新日期: 2023-09-27 17:59:38

这来自工厂模式,其中一个属性用于通过Create:获取实例

public class Dialer
{
    public static Func<Dialer> Create;
    public bool MakeCall(string number) ...
    public Dialer(IDialer impl) { ... }
}

然后,在具有的平台特定项目中,将lambda表达式分配给属性委托

Dialer.Create = () => new Dialer(new PhoneDialeriOS());

为了在独立于平台的项目中获得一个实例,我使用

this.dialer = Dialer.Create();

现在我想使用

public static Action<Dialer> Create;

如果我做对了,现在的任务是

Dialer.Create = (d) => new Dialer(new PhoneDialeriOS());

但是我如何获得一个实例?

this.dialer = // ?

使用this.dialer = Dialer.Create();我得到

错误CS7036没有给定与"Action"的所需形式参数"obj"相对应的参数

但是在这里传递PhoneDialeriOS的实例是没有意义的,因为在独立于平台的代码中无法访问它。我认为我所举的例子有误导性,或者我遗漏了什么。

使用Action而不是Func

Action<Dialer>接收Dialer实例并返回void的委托。毕竟这是Action。如果希望它返回一个值(并获得一个参数),则需要使用Func<Dialer, Dialer>

以下可能是的用法

var specific_dialer = new Dialer(new PhoneDialeriOS());
var defualt_dialer = Dialer.Create();

编辑

你当然可以做一些类似的事情

Dialer.Create = () => new Dialer(new PhoneDialerAndroid());

没有带有Action 的(可能是错误的复制/粘贴)行