C# 使用Action而不是Func

C# 使用Action而不是Func,c#,cross-platform,action,abstraction,func,C#,Cross Platform,Action,Abstraction,Func,这来自工厂模式,其中属性用于通过Create获取实例: public class Dialer { public static Func<Dialer> Create; public bool MakeCall(string number) ... public Dialer(IDialer impl) { ... } } 在我使用的独立于平台的项目中获得一个实例 this.dialer = Dialer.Create(); 现在我想用 public st

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

public class Dialer
{
    public static Func<Dialer> Create;
    public bool MakeCall(string number) ...
    public Dialer(IDialer impl) { ... }
}
在我使用的独立于平台的项目中获得一个实例

this.dialer = Dialer.Create();
现在我想用

public static Action<Dialer> Create;
但是我如何得到一个实例呢

this.dialer = // ?
通过使用
this.dialer=dialer.Create()我明白了

错误CS7036未给出与“Action”的必需形式参数“obj”对应的参数


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

操作
是一个代理,它接收
拨号程序
实例,并返回
void
。毕竟,这是一个
动作
。如果希望它返回一个值(并获取一个参数),则需要使用
Func

Action
是一个代理,它接收一个
拨号程序
实例,并返回
void
。毕竟,这是一个
动作
。如果希望它返回值(并获取参数),则需要使用
Func

以下可能的用法

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

当然你可以做类似的事情

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

如果没有带有操作的(可能是错误的复制/粘贴)行,则可能会有以下用法

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

当然你可以做类似的事情

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

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

,这就是问题所在。该示例讨论了
公共静态动作创建,但这是不可能的,因为我无法传递实例。我认为这个例子是错误的<代码>公共静态动作创建
是唯一正确的方法。
public static Action Create
仍然是一个不返回任何内容的委托。我不确定你怎么能考虑一个不能生产任何东西的工厂,这是“唯一正确的方法”。你说得对。我犯了一个复制粘贴错误<代码>公共静态函数创建是唯一正确的方法。@测试不是唯一正确的方法。这是最典型、最明智的方式。总有另一种方法。@Servy:你是对的。但是我没有看到使用
操作的选项。还是你呢?我不知道作者对此有何想法。也许背后有一些奇特的建筑结构……就是这样。该示例讨论了
公共静态动作创建,但这是不可能的,因为我无法传递实例。我认为这个例子是错误的<代码>公共静态动作创建
是唯一正确的方法。
public static Action Create
仍然是一个不返回任何内容的委托。我不确定你怎么能考虑一个不能生产任何东西的工厂,这是“唯一正确的方法”。你说得对。我犯了一个复制粘贴错误<代码>公共静态函数创建是唯一正确的方法。@测试不是唯一正确的方法。这是最典型、最明智的方式。总有另一种方法。@Servy:你是对的。但是我没有看到使用
操作的选项。还是你呢?我不知道作者对此有何想法。也许背后有一些奇特的建筑结构……啊,我明白了。问题是,访问特定拨号程序的权限非常有限(仅限于特定于平台的项目)。啊,我明白了。问题是对特定拨号程序的访问非常有限(仅在特定于平台的项目中)。