c# -将未知类型的函数传递给另一个函数并调用它

本文关键字:函数 另一个 调用 未知 类型 | 更新日期: 2023-09-27 18:05:44

在我的程序中,我应该得到一个函数作为参数,并从另一个函数中调用它。这能做到吗?
谢谢

c# -将未知类型的函数传递给另一个函数并调用它

当然,您可以只采用Delegate并使用Delegate.DynamicInvokeDelegate.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);
    }