让委托接受任何 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);
}