2016-08-02 94 views
0

Dies ist aus den Fabrik-Mustern, in dem eine Eigenschaft verwendet wird, eine Instanz über Create zu erhalten:Verwenden Aktion statt Func

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

Dann wird ein Lambda-Ausdruck auf die Eigenschaft Delegaten in dem plattformspezifischen Projekt zugeordnet ist mit

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

und eine Instanz in dem plattformunabhängigen Projekt zu bekommen ich

this.dialer = Dialer.Create(); 

Jetzt suche ich

public static Action<Dialer> Create; 

Wenn ich dieses Recht zu nutzen, ist die Zuordnung jetzt

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

aber wie bekomme ich eine Instanz?

this.dialer = // ? 

von this.dialer = Dialer.Create(); ich mit bekommen

Fehler CS7036 Es gibt kein Argument gegeben, die auf den erforderlichen formalen Parameter entspricht 'obj' von 'Action'

Aber es funktioniert nicht sinnvoll, hier eine Instanz von PhoneDialeriOS zu übergeben, da im plattformunabhängigen Code kein Zugriff darauf besteht. Ich denke, das Beispiel, auf das ich mich beziehe, ist irreführend oder ich vermisse etwas.

Antwort

4

Action<Dialer> ist ein Delegierten dass Dialer eine Instanz empfängt, und liefert void. Es ist schließlich ein Action. Wenn Sie möchten, dass es einen Wert zurückgibt (und ein Argument erhält), müssen Sie stattdessen Func<Dialer, Dialer> verwenden.

+0

Das ist die Sache. Das Beispiel redet über 'public static Action Create;', aber das ist nicht möglich, weil ich die Instanz nicht übergeben kann. Imho das Beispiel ist falsch. 'public static Action Erstellen;' ist der einzig richtige Weg. – testing

+0

'öffentliche statische Aktion Erstellen ist immer noch ein Delegat, der nichts zurückgibt. Ich bin mir nicht sicher, wie man eine Fabrik betrachten kann, die nichts als "den einzig richtigen Weg" produzieren kann. – Joey

+0

Sie haben Recht. Ich habe einen Fehler beim Kopieren und Einfügen gemacht. 'public static Func Create;' ist der einzig richtige Weg. – testing

1

Nachfolgend könnte Mögliche Nutzungen sein

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

bearbeiten

Natürlich kann man mit so etwas wie

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

ohne die (wahrscheinlich eine falsche Kopieren/Einfügen) Linie tun können die Aktion

+0

Ahh ich sehe. Die Sache ist, dass der Zugriff auf den spezifischen Dialer sehr begrenzt ist (nur in dem plattformspezifischen Projekt). – testing