定义一个运算符并在多个位置使用它?

3
假设我有以下代码:
if(Something)
    condition |= Class1.Class2.SomeId;
else
    condition &= Class1.Class2.SomeId; 

代码除了&=|=之外都是相同的。我是否可以创建两个运算符“变量”并在代码中使用它们,就像这样:
condition "myoperator" Class1.Class2.SomeId;

谢谢 :-)

参见C#中将运算符作为方法参数。基本上,您可以使用lambda和Func - Matthew Flaschen
很抱歉,您不能创建新的函数,只能重载现有的函数。 - BrunoLM
4个回答

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;
}

是的,我只是想知道是否有可能。所以运算符关键字仅用于重载运算符吗? - grady
您可以在http://msdn.microsoft.com/en-us/library/8edha89s(v=VS.80).aspx?ppud=4上找到更多相关信息。 - Nebril
我不明白你想告诉我什么 :) - grady
如果您可以在代码中创建新的运算符,那么它将使解析代码变得更加复杂,并且可能会产生歧义。 - bruceboughton
@Fosco:是的,完全正确。我想我认为这个问题有更多的实质性内容。也就是说,同样的操作会一遍又一遍地执行。但你是对的,你总是可以用函数式方法来做 test ? when-true : when-false 三元运算符。而且,老实说,这可能比使用 lambda 方法更有效率,因为 lambda 方法必须通过委托来调用。 - Brian Gideon
显示剩余3条评论

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);

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的解决方案。


0

你只能重载自己类的运算符(而不是 Boolean 类的)。

如果条件或某个 ID 属于你的类,那么你可以重载 MSDN 页面上列出的任何运算符(但不能创建全新的运算符)。


你为什么认为SomeId是布尔类型的?我认为它是整型(或任何其他整数类型)。 - Thomas Levesque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接