2012-01-25 27 views
1

的元素指定foreach語句是否有可能實現這樣的事情:是否有可能有PARAMS Func鍵<T>

Process(
    () => InstanceA.PropertyA, 
    () => InstanceB.PropertyB, 
    () => InstanceC.List.Select(x => x.PropertyC) // obviously not a proper way to do it 
); 

第三條線將取代:

foreach(var item in InstanceC.List) 
{ 
    Process(() => item.PropertyC); 
} 

最後一部分:

Process(params Func<object>[] args) // body is in this case irrelevant 

那麼,有沒有一個漂亮的句法糖我可以用產生一個列表的內部元素回params的參數?還是我走得太遠了?

+0

如果InstanceC是一個列表類型,則有一個.ForEach()方法。 – asawyer

回答

1

沒有,但您可以連接,如果你真的希望他們能在同一列表。

var firstTwo = new Func<object>[] 
{ 
() => InstanceA.PropertyA, 
() => InstanceB.PropertyB 
}; 
Process(firstTwo.Concat(InstanceC.List.Select(x =>() => x.PropertyC).ToArray()); 

此評估比您的代碼早InstanceC.List,可能不是您的意圖。

1

我認爲你正在尋找這樣的東西。沒有編譯它,這可能無法正常工作。

Process((new List<Func<Object>> { 
    () => InstanceA.PropertyA, 
    () => InstanceB.PropertyB }).Union( 
     InstanceC.List.Select(x => new Func<Object>(() => x.PropertyC)) 
    ).ToArray() 
); 

編輯:修復了語法,我重新看了一遍......

+0

我真的很希望'x =>()=> x.Something'語法可以工作:) –

+0

再次,我沒有一個編譯器在我面前(我現在在Linux上),但我不知道在這種情況下,類型推斷將認爲委託類型。 –

+0

我認爲沒關係,無論如何這個想法很清楚。 –

相關問題