委托指向具有不同签名的多个功能

时间:2011-04-05 11:53:40

标签: c# delegates

单个代表如何指向具有不同签名的多个函数?

假设我有两个签名不同的函数。

private int Add(int x,int y)
{
   return (x+y);
}

private int MultiplyByTwo(int x)
{
   return (x*2);
}

请告诉我是否可以与单一代表点Add& amp;一次多个两个不同的函数,函数将根据参数调用。

请与代码讨论,并告诉我如何使用func<>执行相同的工作委派。

感谢

3 个答案:

答案 0 :(得分:9)

这是不可能的。委托的要点是作为强类型函数指针(松散地放置),并且运行时也不会根据参数进行任何猜测。如果这是您要查找的功能类型,您可能会对C#4中的dynamic关键字感兴趣。

所有代表都从名为Delegate的公共委托继承,如果这是您正在寻找的功能。

static void Main(string[] args)
{
    Delegate method1 = new Action<string>(PrintOneString);
    Delegate method2 = new Action<string, string>(PrintTwoString);
    method1.DynamicInvoke("Hello");
    method2.DynamicInvoke("Hello", "Goodbye");
}

public static void PrintOneString(string str)
{
    Console.WriteLine(str);
}

public static void PrintTwoString(string str1, string str2)
{
    Console.WriteLine(str1);
    Console.WriteLine(str2);
}

答案 1 :(得分:3)

正如其他人已经说过的那样,这些方法的签名是不同的。您可以将Add方法映射到Func<int, int, int>代理:

Func<int, int, int> add = calculator.Add;

您可以将MultiplyByTo方法映射到Func<int, int>代理:

Func<int, int> multiply = calculator.MultiplyByTo;

您可以将Add方法映射到Func<int, int>委托,但是您需要填写缺少的参数:

Func<int, int> add5 = x => calculator.Add(x, 5);

答案 2 :(得分:2)

代表构建为强类型,因此无法通过使用它们实现您想要的目标

您可能应该考虑动态(。net 4.0)

-OR -

使用反射。您可以将方法名称存储在字符串变量中,然后通过反射调用方法名称。

希望有所帮助