单个代表如何指向具有不同签名的多个函数?
假设我有两个签名不同的函数。
private int Add(int x,int y)
{
return (x+y);
}
private int MultiplyByTwo(int x)
{
return (x*2);
}
请告诉我是否可以与单一代表点Add& amp;一次多个两个不同的函数,函数将根据参数调用。
请与代码讨论,并告诉我如何使用func<>执行相同的工作委派。
感谢
答案 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 -
使用反射。您可以将方法名称存储在字符串变量中,然后通过反射调用方法名称。
希望有所帮助