c# -将未知类型的函数传递给另一个函数并调用它
本文关键字:函数 另一个 调用 未知 类型 | 更新日期: 2023-09-27 18:05:44
在我的程序中,我应该得到一个函数作为参数,并从另一个函数中调用它。这能做到吗?
谢谢
当然,您可以只采用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);
http://msdn.microsoft.com/en-us/library/ms173172(v=vs.80).aspx
或者您可以使用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);
}
示例:
Action logEntrance = () => Debug.WriteLine("Entered");
UpdateUserAccount(logEntrance);
public void UpdateUserAccount(
IUserAccount account,
Action logEntrance)
{
if (logEntrance != null)
{
logEntrance();
}
}
-
使用
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
-
当您确实不知道参数,但您愿意在运行时支付调查它们的成本时,请使用反射。
阅读这里。您将传递
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); }