您可以像在 JavaScript 中一样在 C# 中执行匿名函数:
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# 中可行吗?
更新
用例:我正在遍历一堆数据库,记录特定实体。我不想调用 Logger
的 Log()
中的第二个函数 (F()
),而是调用 F( )
课外。
... 类似以下内容:
public void F(String databaseName)
{
}
public class Logger
{
public void Log(Function f)
{
var databaseName = "";
f(databaseName);
}
}
最佳答案
当然 - 您只需要为该方法提供适当的签名:
public void Execute(Action<string> action)
{
action("Hello world");
}
...
Execute(x => Console.WriteLine(x));
请注意,您必须在参数中指定特定的委托(delegate)类型 - 您不能只将其声明为 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);
关于c# - 作为方法参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3546109/