2017-10-23 1 views
0

Ich habe eine Klasse, die eine Aktion auf ihren Konstruktor nimmt. Ich möchte, dass der _field-Wert des Klassenfelds zum Wert dieser Aktion wird.Get Objekt von Aktion

Ich habe versucht, zu verwenden:

_options = options; 

Aber dies nicht kompiliert. Der vollständige Code ist:

public class PortableObjectTemplate { 

    private PortableObjectTemplateOptions _options { get; set; } 

    public PortableObjectTemplate(Action<PortableObjectTemplateOptions> options) { 
    _options = options; 
    } 
} 

Ich versuche, diese Klasse in der Lage sein zu verwenden, wie:

PortableObjectTemplate pot = new PortableObjectTemplate(x => { 
    x.SearchPath = "/"; 
    x.BlackList = "*.cs"; 
}); 

Wie kann ich das tun?

+3

Was ist 'action'? –

+3

eine 'Aktion' ist ungültig, sie kann keinen Wert zurückgeben. Sie sollten einen 'Func' verwenden. –

+0

@PatrickHofman Sorry, ich habe meinen Code aktualisiert. Ich habe versucht, _options = Optionen –

Antwort

3

Wie im Kommentar erwähnt ist ein Action ein Delegat, der überhaupt nichts zurückgibt (oder void). Wenn Sie Ihre Delegierten wollen etwas zurückgeben sollten Sie einen Func<T> stattdessen verwenden und ausführen es:

public PortableObjectTemplate(Func<PortableObjectTemplateOptions> options) { 
    _options = options(); 
} 

Natürlich sollten Sie überprüfen, ob optionsnull isn't, bevor es (C# 6 nach oben) Ausführung:

_options = options?.Invoke(); 

oder alternativly:

options = options == null ? default(PortableObjectTemplate) : options(); 
+0

Nur eine Nebenmarke: 'Optionen' können null sein. –

+0

'Optionen? .Invoke()'. –

+1

Hinweis zu sich selbst: Wenn Sie die Antwort kennen, schreiben Sie es nicht in die Kommentare. :-). +1 von mir. –