定义一个运算符并在几个地方使用它?

时间:2010-07-14 13:16:46

标签: c# operators

我想这里有这段代码:

if(Something)
    condition |= Class1.Class2.SomeId;
else
    condition &= Class1.Class2.SomeId; 

& = | = 外,代码相同。我可以以某种方式创建2个运算符“变量”,并在代码中使用它们,如下所示:

condition "myoperator" Class1.Class2.SomeId;

谢谢: - )

4 个答案:

答案 0 :(得分:2)

没有。不过,你可以为每个人创造一个功能。

if (Something)
    idOr(ref condition, Class1.Class2.SomeId);
else
    idAnd(ref condition, Class1.Class2.SomeId);


function idOr(ref condition, whatever ID) {
    condition |= ID;
}
function idAnd(ref condition, whatever ID) {
    condition &= ID;
}

答案 1 :(得分:2)

不,你不能完全按照你的要求行事,但lambda表达式可以用于同一目的。

Func<int, int, int> op;
if (Something)
{
  op = (x, y) => x | y;
}
else
{
  op = (x, y) => x & y;
}

condition = op(condition, Class1.Class2.SomeId);

答案 2 :(得分:0)

您只能重载您自己的类的运算符(不是布尔值)

如果条件或SomeId属于您的类,则可以重载该msdn页面上的任何运算符(您无法创建全新的运算符)。

答案 3 :(得分:0)

您可以动态生成一个函数来实现您需要的运算符:

public Func<T, T, T> GetOperator<T>(ExpressionType exprType)
{
    var p1 = Expression.Parameter(typeof(T), "p1");
    var p2 = Expression.Parameter(typeof(T), "p2");
    var expr = Expression.MakeBinary(exprType, p1, p2);
    var lambda = Expression.Lambda<Func<T, T, T>>(expr, p1, p2);
    return lambda.Compile();
}

...

var op = GetOperator<int>(Something ? ExpressionType.Or : ExpressionType.And);
condition = op(condition, Class1.Class2.SomeId);

但这可能有点过分......如果您不需要通用解决方案,只需使用Brian的解决方案。