【问题标题】:Define an operator and use it in several places?定义一个运算符并在多个地方使用它?
【发布时间】:2010-07-14 13:16:45
【问题描述】:

假设我这里有这段代码:

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

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

condition "myoperator" Class1.Class2.SomeId;

谢谢:-)

【问题讨论】:

  • 请参阅 [ 运算符作为 C# 中的方法参数 ](stackoverflow.com/questions/1528319/…)。基本上,您可以使用 lambda 和 Func
  • 恐怕你不能创建新的,只能重载现有的。

标签: c# operators


【解决方案1】:

不,你不能完全按照你的要求做,但是 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】:

    没有。不过,您可以为每个函数创建一个函数。

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

    【讨论】:

    • 是的,我只是想知道这是否可能。那么 operator 关键字只用于重载运算符?
    • 我不明白你想告诉我什么:)
    • 如果您可以在代码中创建新的运算符,那么解析代码会变得更加复杂,并且可能会产生歧义。
    • 我为此添加了示例代码,这对我来说比使用 Lambda 更有意义。同样对于 Lambda 示例,如果“某事”未通过,您如何确定它在范围内?
    【解决方案3】:

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

    如果 condition 或 SomeId 属于您的班级,您可以重载该 msdn 页面上的任何运算符(您不能创建全新的运算符)。

    【讨论】:

    • 是什么让您认为 SomeId 是布尔值?我认为它是一个 int (或任何其他整数类型)
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多