2014-03-01 34 views
-1

我正在使用委託來保存幾個測試值並返回true/false結果的方法。在得知對委託的調用只會返回委託中最後一個方法的結果後,我不確定如何繼續。從代理中的每種方法獲取結果

我想要接收代理中所有方法調用的結果列表,或者是否有任何調用返回true。

首先我試着用foreach枚舉代理,但沒有成功。我不得不拉出來的方法預先像這樣

System.Delegate[] methods = int_testers.GetInvocationList(); 

// Methods in int_testers returns true when a condition is met by the input value 

然後用動態調用每個部件中枚舉「方法」

foreach (var item in ds) { 
    if ((bool)item.DynamicInvoke(4)) 
     return true; 
} 

不過,我讀過DynamicInvoke慢得多(順序幅度或更多)比Invoke這是一個折衷,我不願意。

替代到目前爲止,我發現是有Func<int,bool>列表,並列舉了這些,

List<Func<int,bool>> methods = ....; // Add the methods into the list 

foreach (var method in methods) { 
    if(method(4)) { 
     return true; 
    } 
} 

雖然這個工作,它好像作了一個問題代表來解決。因此,最後,有沒有辦法從代理人手中獲取結果列表,而無需手動模擬代表?

這實質上是從功能角度上使用map函數的結果,但我沒有足夠的C#經驗來將該想法很好地帶入我正在做的事情中。

我爲此看了一下LINQ,看起來它可以與第二種方法一起工作,雖然在這種情況下我似乎無法使用LINQ與委託。

+0

嘿,請不要以爲事不求回報。這是一個庫,用戶將爲方法的委託/列表提供方法,我的代碼在使用它自己的操作然後返回到用戶代碼之前需要使用這些數據。 – PudgePacket

+0

謝謝,Predicate看起來很有前途! – PudgePacket

回答

1

你可以使用Predicate<T>,而不是代表,和LINQ的Any(),而不是一個for循環:

var methods = new List<Predicate<T>>(); 

// add methods to list 

return methods.Any(x => x(4));