2013-11-02 68 views
3

我想根據條件返回一個「謂詞」(它用雙引號引起來,因爲我不知道正確的單詞),它返回對象的不同字段。我希望舉個簡短的例子來說明。與謂詞非常相似,但不是謂詞

Predicate<MyClass> predicate 
if (condition1) 
    predicate = x => x.Field1; 
else if (condition2) 
    predicate = x => x.Field2; 
foreach(vat item in ListOfItems) 
{ 
    predicate(item) = someValue;//Here I am changing the value of that field. 
} 
+0

我認爲你正在尋找一個「屬性選擇表達」。 – Styxxy

+0

如果'Field1'和'Field2'有不同的類型呢? –

+0

在我的情況下,他們是同一類型。 – Anarion

回答

5

您正在尋找的一般術語是"delegate"。雖然您不能直接在C#中使用predicate(item) = someValue;之類的東西,但您可以使用Actions和/或Funcs來完成您正在嘗試執行的操作。獲得價值觀是更常用的做事方式,例如LINQ的Select能等來實現:

public static IEnumerable<TResult> Select<TSource, TResult>(
    this IEnumerable<TSource> source, 
    Func<TSource, TResult> selector 
) 
{ 
    foreach (var item in source) 
     yield return selector(item); 
} 

,並使用類似:

myList.Select(x => x.Field1); 

您可以定義的東西,可以設置屬性,如:

public static void SetAll<TSource, TProperty>(
    this IEnumerable<TSource> source, 
    Action<TSource, TProperty> setter, 
    TProperty someValue // example for how to get the value 
) 
{ 
    foreach (var item in source) 
    { 
     setter(item, someValue); 
    } 
} 

而且使用它像:

myList.SetAll((x, value) => x.Property1 = value, "New value"); 
// all Property1s are now "New value" 

或者喜歡的東西你的例子:

Action<MyClass, string> predicate; 
if (condition1) 
    predicate = (x, value) => x.Property1 = value; 
else 
    predicate = (x, value) => x.Property2 = value; 
foreach (var item in ListOfItems) 
{ 
    predicate(item, someValue); 
} 
0

好吧,我決定去與此:

Func<MYClass, DateTime> f = null; 
if (Condition1) 
    f = x => x.Field1; 
else if (condition2) 
    f = x => x.Field2;