C# 委托/Func() 中 GetInvocationList() 方法的使用 | 接收委托多個返回值


在日常使用委托時,有以下常用方法

方法名稱 說明
 Clone   創建委托的淺表副本。
 GetInvocationList   按照調用順序返回此多路廣播委托的調用列表。
 GetMethodImpl   返回由當前的 MulticastDelegate 表示的靜態方法。
 GetObjectData   用序列化該實例所需的所有數據填充 SerializationInfo 對象。
 MemberwiseClone   創建當前 Object 的淺表副本。
 RemoveImpl   調用列表中移除與指定委托相等的元素

GetInvocationList() 的用途

當委托有多個返回值時

當你編寫一個 delegate委托 或 Func<>泛型委托 ,並為實例綁定多個方法時,每個方法都有一個返回值。可能會遇到這種情況:

  class Program
    {
        public static string a(string str)
        {
            Console.WriteLine("方法a");
            return str+"方法a";
        }
        public static string b(string str)
        {
            Console.WriteLine("方法b");
            return str + "方法b";
        }
        public static string c(string str)
        {
            Console.WriteLine("方法c");
            return str + "方法c";
        }
        static void Main(string[] args)
        {
            Func<string, string> func=a;
            func += b;
            func += c;
            Console.WriteLine(func("測試"));
            Console.ReadKey();
        }

    }

 調用委托后,只能獲取到最后一個調用方法的返回值。


 

使用 GetInvocationList() 

GetInvocationList() 能夠返回 這個委托的方法鏈表。

通過使用循環,把每個方法順序調用一次,每次循環中都會產生當前調用方法的返回值。

    class Program
    {
        public static string a(string str)
        {
            Console.WriteLine("方法a");
            return str+"方法a";
        }
        public static string b(string str)
        {
            Console.WriteLine("方法b");
            return str + "方法b";
        }
        public static string c(string str)
        {
            Console.WriteLine("方法c");
            return str + "方法c";
        }
        static void Main(string[] args)
        {
            Func<string, string> func=a;
            func += b;
            func += c;
            var funclist = func.GetInvocationList();
            foreach (Func<string, string> f in funclist)
            {
                Console.WriteLine(f("測試"));
            }
            Console.ReadKey();
        }

  

 

相當於把委托里順序調用的方法分離成一個列表,通過循環調用,循環獲取。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM