我希望有一个“谓词”(它在引号中,因为我不知道正确的单词),它会根据条件返回对象的不同字段。我希望有一个简短的例子来说明。
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 :(得分:5)
您正在寻找的一般术语是"delegate"。虽然您无法在C#中直接执行predicate(item) = someValue;
之类的操作,但您可以使用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);
}
答案 1 :(得分:0)
好吧,我决定这样做:
Func<MYClass, DateTime> f = null;
if (Condition1)
f = x => x.Field1;
else if (condition2)
f = x => x.Field2;