使用Action而不是Func

时间:2016-08-02 12:32:13

标签: c# cross-platform action abstraction 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();我得到

  

错误CS7036没有给出对应于'Action'所需的形式参数'obj'的参数

但是在这里传递PhoneDialeriOS的实例是没有意义的,因为在与平台无关的代码中无法访问它。我认为我所关注的例子是误导性的,或者我错过了一些东西。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

以下可能是可能的用法

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

修改

当然你可以做点什么

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

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