在我的程序中,我想将一个函数作为参数,并从另一个函数中调用它。能做到吗?
谢谢
答案 0 :(得分:3)
答案 1 :(得分:3)
当然,您可以使用Delegate
并使用Delegate.DynamicInvoke
或Delegate.Method.Invoke
。除了更多信息,这将回答您的问题。
因此:
class Foo {
public void M(Delegate d) {
d.DynamicInvoke();
}
}
Action action = () => Console.WriteLine("Hello, world!");
var foo = new Foo();
foo.M(action);
答案 2 :(得分:0)
或者您可以使用lambda表达式。委托仍然,但代码更快。
private static void Main(string[] args)
{
NoReturnValue((i) =>
{
// work here...
Console.WriteLine(i);
});
var value = ReturnSometing((i) =>
{
// work here...
return i > 0;
});
}
private static void NoReturnValue(Action<int> foo)
{
// work here to determind input to foo
foo(0);
}
private static T ReturnSometing<T>(Func<int, T> foo)
{
// work here to determind input to foo
return foo(0);
}
答案 3 :(得分:-2)
一个例子:
Action logEntrance = () => Debug.WriteLine("Entered");
UpdateUserAccount(logEntrance);
public void UpdateUserAccount(
IUserAccount account,
Action logEntrance)
{
if (logEntrance != null)
{
logEntrance();
}
}
答案 4 :(得分:-2)
使用Func
使用任意功能,同时保持类型安全。
这可以使用内置的Func泛型类完成:
给定一个带有以下签名的方法(在这种情况下,它需要一个int并返回一个bool):
void Foo(Func<int, bool> fun);
您可以这样称呼它:
Foo(myMethod);
Foo(x => x > 5);
您可以将任意函数分配给Func实例:
var f = new Func<int, int, double>((x,y) => { return x/y; });
你可以将f
传递到以后可以使用的地方:
Assert.AreEqual(2.0, f(6,3)); // ;-) I wonder if that works
有关详细信息,请参阅here。
当您确实不知道参数时使用Reflection,但您愿意支付运行时调查它们的费用。
了解这个here。您将传递MemberInfo
的实例。您可以查询其参数以动态发现其编号和类型。
使用dynamic
获得完全的自由。没有类型安全。
在C#4.0中,您现在拥有dynamic
关键字。
public void foo(dynamic f) {
f.Hello();
}
public class Foo {
public void Hello() { Console.WriteLine("Hello World");}
}
[Test]
public void TestDynamic() {
dynamic d = new Foo();
foo(d);
}
详情请见here。