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.
}
4

2 に答える 2

5

あなたが探している一般的な用語は"delegate"です。predicate(item) = someValue;C# のようなことを直接行うことはできませんが、 ActionsFuncsを使用して、やろうとしていることを行うことができます。値を取得することは、物事を行うためのより一般的な方法です。たとえば、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);
}
于 2013-11-02T16:35:11.033 に答える