作为方法的参数

时间:2010-08-23 09:10:22

标签: c# functional-programming

您可以在JavaScript中执行匿名函数,就像在JavaScript中一样:

JavaScript的:

var s = (function ()
{
    return "Hello World!";
}());

C#:

var s = new Func<String>(() =>
{
    return "Hello World!";
})();

...在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")
}

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


更新

用例:我正在迭代一堆数据库,记录特定的实体。我不想在F()的{​​{1}}内调用我的第二个函数(Log()),而是在课堂外调用Logger

......有些事情:

F()

4 个答案:

答案 0 :(得分:6)

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

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

请注意,您必须在参数中指定特定的委托类型 - 例如,您不能将其声明为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);

答案 1 :(得分:1)

您可以传递委托:

        var f = (Action<string>)
                (x =>
                     {
                         Console.WriteLine(x);
                     }
                );

        var execute = (Action<Action<string>>)
                      (cmd =>
                           {
                               cmd("Hello");
                           }
                      );
        execute(f);

答案 2 :(得分:1)

根据您的更新部分:  你需要一个容器来保存你的功能

 IList<Action<string>> actionList = new List<Action<Sstring>>();

在Log()函数中,您可以将F()添加到容器中:

actionList.Add(F);

然后在外面的某处调用函数:

 foreach (Action<string> func in actionList)
      {
           func("databasename");
      }

答案 3 :(得分:0)

像:

var s = new Func<String, string>((string name) =>
{
    return string.Format("Hello {0}!", name);
});