4

一般的なメソッドを呼び出す2つのハンドラincrement_clickとdecrement_clickがあるとしましょう

実際には、私のメソッドはもっと複雑になる可能性があるため、if のような構文を使用することは避けたいと考えています。

if (operator == "+") {
     return value = value + step
}
else {
     return value = value - step
}

そして、このようなより一般的なことをします

increment(value, operator, step) {
     return value = value <operator> step
}

どういうわけか可能ですか?

4

4 に答える 4

11

Dictionary<string,Func<decimal,decimal,decimal>>次のように、オペレーターの実装を使用して を作成し、セットアップできます。

private static readonly IDictionary<string,Func<decimal,decimal,decimal>> ops = new Dictionary<string,Func<decimal,decimal,decimal>> {
    {"+", (a,b) => a + b}
,   {"-", (a,b) => a - b}
,   {"*", (a,b) => a * b}
,   {"/", (a,b) => a / b}
};

今、あなたはこれを行うことができます:

decimal Calculate(string op, decimal a, decimal b) {
    return ops[op](a, b);
}

C# で定義されたビルド済みのラムダを使用するLinq.Expressions代わりに、ラムダをプログラムで定義し、Func<T,T,T>.

于 2013-06-09T18:38:00.210 に答える
2

これがはるかに優れているとは思いませんが、良いオプションです

int sign = (operator == "+" ? 1 : -1);
retrun value +sign*value;
于 2013-06-09T18:39:43.627 に答える
1

いいえ、変数をパラメータ化して型をジェネリック化することしかできません。

于 2013-06-09T18:37:14.980 に答える