In everyday use of delegates, the following common methods are available:
| Method Name | Description |
|---|---|
| Clone | Creates a shallow copy of the delegate. |
| GetInvocationList | Returns a list of calls for this multicast delegate in the order they will be invoked. |
| GetMethodImpl | Returns the static method represented by the current MulticastDelegate. |
| GetObjectData | Fills the SerializationInfo object with all the data needed to serialize this instance. |
| MemberwiseClone | Creates a shallow copy of the current Object. |
| RemoveImpl | Removes elements that are equal to the specified delegate from the invocation list. |
Usage of GetInvocationList()
When a delegate has multiple return values
When you write a delegate or a Func<> generic delegate and bind multiple methods to the instance, each method will have a return value. This situation may arise:
class Program { public static string a(string str) { Console.WriteLine("Method a"); return str+"Method a"; } public static string b(string str) { Console.WriteLine("Method b"); return str + "Method b"; } public static string c(string str) { Console.WriteLine("Method c"); return str + "Method c"; } static void Main(string[] args) { Func<string, string> func=a; func += b; func += c; Console.WriteLine(func("Test")); Console.ReadKey(); }}</span></pre>

After invoking the delegate, only the return value of the last called method can be retrieved.
Using GetInvocationList()
GetInvocationList() can return the method chain of this delegate.
By using a loop, each method can be invoked in order, and the return value of the currently invoked method will be generated in each iteration.
class Program
{
public static string a(string str)
{
Console.WriteLine("Method a");
return str+"Method a";
}
public static string b(string str)
{
Console.WriteLine("Method b");
return str + "Method b";
}
public static string c(string str)
{
Console.WriteLine("Method c");
return str + "Method 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("Test"));
}
Console.ReadKey();
}

This effectively separates the methods invoked in the delegate into a list, allowing for each to be called in a loop to retrieve their results.
文章评论