作为方法的参数

cll*_*pse 2 c# functional-programming

您可以在JavaScript中使用C#执行匿名函数:

JavaScript的:

var s = (function ()
{
    return "Hello World!";
}());
Run Code Online (Sandbox Code Playgroud)

C#:

var s = new Func<String>(() =>
{
    return "Hello World!";
})();
Run Code Online (Sandbox Code Playgroud)

...在JavaScript中,您可以传递要由其他函数执行的函数.最重要的是; 你可以将参数传递给执行的函数:

var f = function (message) // function to be executed
{
    alert(message);
};

function execute(f) // function executing another function
{
    f("Hello World!"); // executing f; passing parameter ("message")
}
Run Code Online (Sandbox Code Playgroud)

以上示例是否可以在C#中使用?


更新

用例:我正在迭代一堆数据库,记录特定的实体.与其说我的第二个功能(的F()内部)Log()Logger,我想打电话F()外班.

......有些东西:

public void F(String databaseName)
{
}

public class Logger
{
    public void Log(Function f)
    {
        var databaseName = "";

        f(databaseName);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

绝对 - 你只需要给该方法一个适当的签名:

public void Execute(Action<string> action)
{
    action("Hello world");
}
...
Execute(x => Console.WriteLine(x));
Run Code Online (Sandbox Code Playgroud)

请注意,您必须在参数中指定特定的委托类型 - 您不能仅将其声明Delegate为例如.

编辑:你的数据库示例与此完全相同 - 你想传入一个字符串而不是任何输出,这正是做什么的Action<string>.除非您尝试调用现有方法(F()在您的代码中),否则您甚至不需要lambda表达式 - 您可以使用方法组转换:

public void F(String databaseName)
{
}

public class Logger
{
    public void Log(Action<string> f)
    {
        var databaseName = "";

        f(databaseName);
    }
}

// Call it like this:
Logger logger = new Logger(...);
logger.Log(F);
Run Code Online (Sandbox Code Playgroud)