让委托接受任何 return 和任何参数的最佳方法是什么?
What is the best way to make a delegate that accept any return and any parameter?
我正在尝试做一个可以接受任何东西的代表,或者 return anything.Why 只是 运行 并了解限制。到目前为止,我知道的唯一方法是在任何地方使用 "object" 关键字并传递一个 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 岁了
所以舒尔的一切工作。有没有关于我如何改进这个的 idia?
更安全
更易于使用....等等
谢谢!欢迎讨论!
更新:22/07/2015
很好,我终于尝试了所有的可能性,我终于得出了一个非常简单的结果!
感谢 Mike Hixson 和他的想法....他让我走上了正确的轨道。
所以 action 和 func<> 的重要之处在于你不能将它们作为函数的参数。因此,请快速展示一个示例....
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();
}
控制台 return:
5
嗨,工作!哈哈
所以所有的结果都是预期的。
你有没有看到我可以使用我与我的委托一起使用的函数的 return 并使用具有任何数量或类型的参数的函数。目标达成!唯一不完美的小事情是......通过这种方式,我无法选择使用带有 return 的函数......但是在一个函数上有一点 return true 无论如何。
如果有任何更好的想法或改进,请直接说出来,我很乐意对其进行测试。
如果您想要一个可以接收多个参数的类型安全委托,您可以使用 Action 委托:
https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx
此委托有 16 种实现,允许指定 1 到 16 个参数。
如果您的委托必须 return 一个值,则使用 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);
}
我正在尝试做一个可以接受任何东西的代表,或者 return anything.Why 只是 运行 并了解限制。到目前为止,我知道的唯一方法是在任何地方使用 "object" 关键字并传递一个 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 岁了
所以舒尔的一切工作。有没有关于我如何改进这个的 idia? 更安全 更易于使用....等等
谢谢!欢迎讨论!
更新:22/07/2015
很好,我终于尝试了所有的可能性,我终于得出了一个非常简单的结果! 感谢 Mike Hixson 和他的想法....他让我走上了正确的轨道。
所以 action 和 func<> 的重要之处在于你不能将它们作为函数的参数。因此,请快速展示一个示例....
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();
}
控制台 return:
5 嗨,工作!哈哈
所以所有的结果都是预期的。
你有没有看到我可以使用我与我的委托一起使用的函数的 return 并使用具有任何数量或类型的参数的函数。目标达成!唯一不完美的小事情是......通过这种方式,我无法选择使用带有 return 的函数......但是在一个函数上有一点 return true 无论如何。
如果有任何更好的想法或改进,请直接说出来,我很乐意对其进行测试。
如果您想要一个可以接收多个参数的类型安全委托,您可以使用 Action 委托:
https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx
此委托有 16 种实现,允许指定 1 到 16 个参数。
如果您的委托必须 return 一个值,则使用 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);
}