您可以在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()
答案 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);
});