【问题标题】:C# Accept Object Parameter via LambdaC# 通过 Lambda 接受对象参数
【发布时间】:2016-09-11 14:58:00
【问题描述】:

我想使用 lambda 表达式将对象发送到参数。

如果我有这样的设置类:

public class Settings() {
    public string Name {get;set;}
    public string Whatever {get;set;}
}

还有一些其他方法,其参数是一个设置类:

public object GenerateIt(Settings settings) {
    // stuff here
}

我想这样称呼它:

myObject.GenerateIt(
    s => {
        s.Name = "this";
        s.Whatever = "whatever";
    }
)

我已经尝试过了,但效果不佳:

public object GenerateIt(Func<Settings> settings) { ... }

我也在尝试(根据当前答案)使用操作:

public object GenerateIt(Action<Settings> settings) { ... }

...这允许我(显然)以我喜欢的方式调用该方法,但我似乎无法找到如何访问我传入的那些设置?

public object GenerateIt(Action<Settings> settings) {

    Console.WriteLine(settings.Name);   // nope

    var s = settings(); // nope

    ??? 
}

(是的,我确实查阅了文档 - 如果在那之后我清楚,我就不会再问了)

如“我想这样称呼它”示例中所示,允许传递对象的正确机制是什么?谢谢

【问题讨论】:

    标签: c# lambda


    【解决方案1】:

    阅读文档。

    Func&lt;T&gt; 返回 T 并且不带任何参数。你想要Action&lt;T&gt;

    【讨论】:

    • 请查看问题更新...然后如何在目标方法中使用设置对象?
    • @jdl134679 你可以像var s = new Settings(); settings(s); 一样调用它,s 将包含你的属性集。
    • 我明白了...创建一个新变量,将其传递给动作,动作相应地填充变量。这行得通,谢谢
    【解决方案2】:
    public object GenerateIt(Action<Settings> settings) { ... }
    

    在此处阅读有关动作、功能和预测的更多信息: Delegates: Predicate Action Func

    更新:不确定您要归档什么,但试试这个。

    【讨论】:

    • 我如何在该方法的主体中使用settings?使用Func,我会说Settings s = settings.Invoke(),然后使用s 变量来访问我传递的内容......似乎无法找到如何使用Action 来做到这一点
    猜你喜欢
    • 1970-01-01
    • 2017-11-24
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2017-03-06
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多