使用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<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 的(可能是错误的复制/粘贴)行