使委托接受任何返回和任何参数的最佳方法是什么?

时间:2015-07-22 03:20:10

标签: c# function optimization delegates limits

我试图做一个可以接受任何东西或返回任何东西的委托。为什么只是运行并理解限制。到目前为止,我所知道的唯一方法是使用"对象"关键字无处不在,并传递参数的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 嗨,它的工作!哈哈

所有结果都是预期的结果。

你可以看到我可以使用我的代理使用的函数的返回,并使用任何数量或类型的参数的函数。达到了目标!唯一不完美的小东西是......用这种方式我没有选择使用带返回的函数....但是对于函数来说,无论如何都会回归真实。

如果有任何更好的想法或改进只是说它我将很乐意测试它。

1 个答案:

答案 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);
}