2016-08-02 3 views
0

Ceci est du modèle de l'usine, où une propriété est utilisée pour obtenir une instance via Create:Utilisation d'action au lieu de Func

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

Ensuite, une expression lambda est affecté au délégué de la propriété dans le projet spécifique à la plateforme avec

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

et pour obtenir une instance dans le projet de plate-forme indépendante que j'utilise

this.dialer = Dialer.Create(); 

Maintenant, je suis à la recherche d'utiliser

public static Action<Dialer> Create; 

Si je reçois ce droit, l'affectation est maintenant

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

mais comment puis-je obtenir une instance?

this.dialer = // ? 

En utilisant this.dialer = Dialer.Create(); je reçois

Erreur CS7036 Il n'y a aucun argument donné qui correspond au paramètre formel requis 'obj' de 'Action'

Mais il ne Il est logique de passer une instance de PhoneDialeriOS ici, car il n'y a pas d'accès dans le code indépendant de la plate-forme. Je pense que l'exemple dont je parle est trompeur ou qu'il me manque quelque chose.

Répondre

4

Action<Dialer> est un délégué qui reçoit une instance Dialer et renvoie void. C'est un Action, après tout. Si vous voulez renvoyer une valeur (et obtenir un argument), vous devez utiliser Func<Dialer, Dialer> à la place.

+0

C'est la chose. L'exemple parle de 'public static Action Create;', mais cela n'est pas possible car je ne peux pas passer l'instance. Imho l'exemple est faux. 'public static Action Créer;' est le seul moyen correct. – testing

+0

'public static Action Create' est toujours un délégué qui ne renvoie rien. Je ne sais pas comment vous pouvez considérer une usine qui ne peut produire rien comme "la seule façon correcte". – Joey

+0

Vous avez raison. J'ai fait une erreur de copier et coller. 'public static Func Créer;' est la seule façon correcte. – testing

1

Ce qui suit pourrait être usages possibles

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

Modifier

Bien sûr, vous pouvez faire de la ligne quelque chose comme

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

sans (probablement une mauvaise copier/coller) avec l'action

+0

Ahh je vois. Le problème est que l'accès au numéroteur spécifique est très limité (uniquement dans le projet spécifique à la plate-forme). – testing