使用 Action 而不是 Func

Use Action instead of Func

这是来自工厂模式,其中一个属性用于通过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(); 我得到

Error CS7036 There is no argument given that corresponds to the required formal parameter 'obj' of 'Action'

但是在这里传递一个PhoneDialeriOS的实例是没有意义的,因为在平台无关的代码中没有访问它的权限。我认为我提到的例子具有误导性,或者我遗漏了一些东西。

Action<Dialer> 是一个委托,它 接收 一个 Dialer 实例,并且 return 接收 void。毕竟是 Action。如果你想让它 return 一个值(并得到一个参数),你需要使用 Func<Dialer, Dialer> 代替。

以下是可能的用法

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

编辑

当然你可以这样做

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

没有(可能是错误的 copy/paste)行与 Action