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

时间:2011-08-15 18:30:19

标签: c# generic-programming

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

5 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

当然,您可以使用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);

答案 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