我试图做一个可以接受任何东西或返回任何东西的委托。为什么只是运行并理解限制。到目前为止,我所知道的唯一方法是使用"对象"关键字无处不在,并传递参数的onbject列表。 对我而言,它似乎非常不安全,并且不容易使用。
例如:
delegate object doAnyFunction(List<object> inputs);
public static object writeMessages(List<object> inputs)
{
Console.WriteLine("hi " + inputs[0] + " i K=know u have " + inputs[1]+ " year old");
return null;
}
static void Main(string[] args)
{
string name = "tomas";
int age = 26;
doAnyFunction doAny = new doAnyFunction(writeMessages);
doAny(new List<object> {name,age});
Console.Read();
}
控制台输出结果:嗨托马斯我知道你有26岁
所以eveything为shure工作。任何人都有如何改善这一点? 更安全 更容易使用....等
谢谢!随时辩论!
更新:22/07/2015
好我终于尝试了所有可能性,我终于得出了一个非常简单的结果! 感谢Mike Hixson和他的想法....他让我走上正轨。
关于行动和功能的重要事项&lt;&gt;你不能把它们作为参数放在一个函数中。所以我只是快速展示一个例子......
Public delegate object DoAnything();
Class Program
{
Static int additioner(int num1 , int num2)
{
return num1 + num2;
}
static object dostuff(DoAnything doit)
{
return doit();
}
static object writeMessage(string message)
{
Console.WriteLine(message);
return true;
}
static void Main(string[] args)
{
DoAnything del1 = delegate() { return additioner(1, 4); };
DoAnything del2 = delegate() { return writeMessage("hi it Work! haha"); };
Console.WriteLine(dostuff(del1));
del2();
Console.Read();
}
控制台返回:
5 嗨,它的工作!哈哈
所有结果都是预期的结果。
你可以看到我可以使用我的代理使用的函数的返回,并使用任何数量或类型的参数的函数。达到了目标!唯一不完美的小东西是......用这种方式我没有选择使用带返回的函数....但是对于函数来说,无论如何都会回归真实。
如果有任何更好的想法或改进只是说它我将很乐意测试它。
答案 0 :(得分:1)
如果你想要一个可以接受许多参数的类型安全委托,你可以使用Action委托:
https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx
此委托有16个实现,允许指定1到16个参数。
如果您的委托必须返回一个值,那么请使用Func委托:
https://msdn.microsoft.com/en-us/library/bb534960(v=vs.110).aspx
这个也有16个实现允许1到16个参数。
<强>更新强>
这是一个例子。设置2可与Action<string, int>
一起使用的功能:
static void WriteMessageOriginal(string name, int age)
{
Console.WriteLine("hi " + name + " i K=know u have " + age + " year old");
}
static void WriteMessageNew(string name, int age)
{
Console.WriteLine("hi {0}, I know you are {1} years old", name, age);
}
创建一个可以使用Action<string, int>
并使用字符串和整数调用它的函数。
static void DoMessageDelgate(Action<string, int> mydelegate)
{
mydelegate("tomas", 26);
}
使用不同的代表调用方法。
static void Main()
{
DoMessageDelgate(WriteMessageOriginal);
DoMessageDelgate(WriteMessageNew);
}