Tôi cần biết thêm một chút về các đại biểu và thiết kế ngôn ngữ C#.Làm thế nào để có được danh sách kết quả của lời kêu gọi của đại biểu?
Hãy nói, tôi có một MulticastDelegate
mà thực hiện generic đại biểu và chứa một số cuộc gọi:
Func<int> func = null;
func += ()=> return 8;
func +=() => return 16;
func +=() => return 32;
Bây giờ mã này sẽ trở lại 32:
int x = func(); // x=32
Tôi muốn biết nếu có tồn tại (hoặc tốt hơn tôi nên hỏi tại sao nó không tồn tại!) Tính năng ngôn ngữ C# sử dụng có thể nhận được quyền truy cập vào kết quả của tất cả các cuộc gọi của đại biểu, điều đó có nghĩa là lấy danh sách ({8,16,32})?
Tất nhiên, có thể thực hiện tương tự bằng cách sử dụng các thường trình khuôn khổ .NET. Một cái gì đó như thế này sẽ làm việc:
public static List<TOut> InvokeToList<TOut>(this Func<TOut> func)
{
var returnValue = new List<TOut>();
if (func != null)
{
var invocations = func.GetInvocationList();
returnValue.AddRange(invocations.Select(@delegate => ((Func<TOut>) @delegate)()));
}
return returnValue;
}
Nhưng tôi không thể thoát ra khỏi hệ thống mà cần có những cách tốt hơn, ít nhất là không đúc (thực sự, tại sao MulticastDelegate là không chung khi các đại biểu là)?
'thực sự, tại sao MulticastDelegate không nằm trong khuôn khổ kể từ 1.1, có nghĩa là khi nó được mã hóa không có sẵn bất kỳ generics nào. – Will