Общий термин, который вы ищете, - "delegate". Хотя вы не можете напрямую делать что-то вроде predicate(item) = someValue;
в C#, вы можете использовать Action
s и/или Func
s, чтобы делать то, что вы пытаетесь сделать. Получение ценностей - это более обычный способ делать вещи, например. 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);
}
Я думаю, что вы ищете «выражение свойств селектора» а. – Styxxy
Что делать, если 'Field1' и' Field2' имеют разные типы? –
В моей ситуации они одного типа. – Anarion