2010-04-01 20 views
13

Làm cách nào để tạo hành động Hành động trong một vòng lặp? để giải thích (xin lỗi nó quá dài)làm cách nào để kết hợp một số Hành động <T> thành một Hành động <T> trong C#?

tôi có như sau:

public interface ISomeInterface { 
    void MethodOne(); 
    void MethodTwo(string folder); 
} 

public class SomeFinder : ISomeInterface 
{ // elided 
} 

và một lớp trong đó sử dụng các phần trên:

public Map Builder.BuildMap(Action<ISomeInterface> action, 
          string usedByISomeInterfaceMethods) 
{ 
    var finder = new SomeFinder(); 
    action(finder); 
} 

tôi có thể gọi nó với một trong những điều này và nó hoạt động tuyệt vời:

var builder = new Builder(); 

var map = builder.BuildMap(z => z.MethodOne(), "IAnInterfaceName"); 
var map2 = builder(z => 
        { 
        z.MethodOne(); 
        z.MethodTwo("relativeFolderName"); 
        }, "IAnotherInterfaceName"); 

Tôi có thể xây dựng triển khai thứ hai theo cách lập trình như thế nào? ví dụ:

List<string> folders = new { "folder1", "folder2", "folder3" }; 
folders.ForEach(folder => 
       { 
       /* do something here to add current folder to an expression 
        so that at the end I end up with a single object that would 
        look like: 
        builder.BuildMap(z => { 
            z.MethodTwo("folder1"); 
            z.MethodTwo("folder2"); 
            z.MethodTwo("folder3"); 
            }, "IYetAnotherInterfaceName"); 
       */ 
       }); 

Tôi đã suy nghĩ tôi cần một

Expression<Action<ISomeInterface>> x 

hoặc một cái gì đó tương tự, nhưng đối với cuộc sống của tôi, tôi không nhìn thấy làm thế nào để xây dựng những gì tôi muốn. Bất kỳ suy nghĩ sẽ được đánh giá rất cao!

Trả lời

22

Nó thực sự dễ dàng, bởi vì các đại biểu đã multicast:

Action<ISomeInterface> action1 = z => z.MethodOne(); 
Action<ISomeInterface> action2 = z => z.MethodTwo("relativeFolderName"); 
builder.BuildMap(action1 + action2, "IAnotherInterfaceName"); 

Hoặc nếu bạn đã có một bộ sưu tập của họ đối với một số lý do:

IEnumerable<Action<ISomeInterface>> actions = GetActions(); 
Action<ISomeInterface> action = null; 
foreach (Action<ISomeInterface> singleAction in actions) 
{ 
    action += singleAction; 
} 

Hoặc thậm chí:

IEnumerable<Action<ISomeInterface>> actions = GetActions(); 
Action<ISomeInterface> action = (Action<ISomeInterface>) 
    Delegate.Combine(actions.ToArray()); 
+0

Cảm ơn bạn đã phản hồi nhanh! Tôi đang cố gắng này ngay bây giờ, nhưng nó có vẻ tốt cho đến nay. – JohnKeller

+0

Điều đó đã làm các trick, cảm ơn bạn! Một lời nhắc nhở tuyệt vời để suy nghĩ về các giải pháp đơn giản đầu tiên! – JohnKeller

+1

Điều này thật đẹp. Tôi đã không thực sự hiểu những gì đại biểu multicast cho đến bây giờ. –

Các vấn đề liên quan