具有不同retun类型的通用委托

时间:2016-12-16 13:43:39

标签: c# delegates

我有一些不同返回类型的方法,比如int和double。

但我现在尝试迭代不同的方法。

我这样试试:

delegate T MeDelegate<T>();
    class Program
    {
        static void Main(string[] args)
        {
            Func<int> d = ReturnFive;
            d += ReturnTen;
            d += ReturnTwentyTwo;
            d += returnDoubles;

            foreach (int i in GetAllReturnValues(d))
                Console.WriteLine(i);
            Console.ReadKey();


        }

        static IEnumerable<TArgs> GetAllReturnValues<TArgs>(Func<TArgs> d)
        {

            List<int> ints = new List<int>();
            foreach (Func<TArgs> item in d.GetInvocationList())
                yield return item();


        }

        static int ReturnFive() { return 5; }
        static int ReturnTen() { return 10; }
        static int ReturnTwentyTwo() { return 22; }
        static double returnDoubles() { return 1.0; }

    }

和当然:Func<int> d

不起作用。但是如何改善呢?

谢谢

3 个答案:

答案 0 :(得分:0)

我不确定这是否是您想要的,但请尝试使用以下代码。

delegate T MeDelegate<T>();
class Program
{
    static void Main(string[] args)
    {
        Func<object> functionDelegates = ReturnFive;
        functionDelegates += ReturnTen;
        functionDelegates += ReturnTwentyTwo;
        functionDelegates += ReturnSomeDoubleValue;

        foreach (object value in GetAllReturnValues(functionDelegates))
        {
            Console.WriteLine(value);
        }
        Console.ReadKey();
    }

    static IEnumerable<TArgs> GetAllReturnValues<TArgs>(Func<TArgs> functionDelegates)
    {
        return from Func<TArgs> function in functionDelegates.GetInvocationList() select function();
    }

    static object ReturnFive() { return 5; }
    static object ReturnTen() { return 10; }
    static object ReturnTwentyTwo() { return 22; }
    static object ReturnSomeDoubleValue() { return 1.0; }

}

答案 1 :(得分:0)

+ =电线事件。你想要做的是将它们存储在一个数组中。

class Program
    {
        static void Main(string[] args)
        {
            Func<object>[] d = new Func<object>[] { ReturnFive, ReturnTen, ReturnTwentyTwo, returnDoubles };

            foreach (object i in GetAllReturnValues<object>(d))
                Console.WriteLine(i);
            Console.ReadKey();


        }

        static IEnumerable<object> GetAllReturnValues<TArgs>(Func<object>[] d)
        {

            List<int> ints = new List<int>();
            foreach (Func<object> item in d)
                yield return item();


        }

        static object ReturnFive() { return 5; }
        static object ReturnTen() { return 10; }
        static object ReturnTwentyTwo() { return 22; }
        static object returnDoubles() { return 1.0; }

    }

答案 2 :(得分:-1)

不确定你想要实现什么,但如果你想要具有不同回报类型的功能,你可以随时动态

List<dynamic> allReturns = new List<dynamic>{ ReturnFive(), ReturnTen(), ReturnTwentyTwo(), returnDoubles() };

 foreach (dynamic i in allReturns)
      Console.WriteLine(i);
  Console.ReadKey();