2013-11-02 2 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". Хотя вы не можете напрямую делать что-то вроде predicate(item) = someValue; в C#, вы можете использовать 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; 
Смежные вопросы