我想这里有这段代码:
if(Something)
condition |= Class1.Class2.SomeId;
else
condition &= Class1.Class2.SomeId;
除& = 和 | = 外,代码相同。我可以以某种方式创建2个运算符“变量”,并在代码中使用它们,如下所示:
condition "myoperator" Class1.Class2.SomeId;
谢谢: - )
答案 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的解决方案。