使用按位运算符的数据列类不起作用



我有一个DataColumn实现来计算运行时的表达式。令我惊讶的是,DataColumn 操作不支持按位运算符。

需要检查单个位集或一组位集。例子:

(Value & 0x0002)检查第二位设置。应返回真值 (1)。

((Value & 0x000F) == 0x03)检查 Value 的前 4 位的值是否为 3。

有没有办法使用数据列类支持这些按位运算?

是否有支持按位运算的数据列的替代方案?

关于如何使用常用数学运算符的建议?

[编辑 - 完整的功能代码]

public static bool EvaluateExpression(string expression, object value, out object returnValue, out string errorMessge)
{
    try
    {
        errorMessge = String.Empty;
        ///
        /// First substitute the references of object with its value
        /// 
        string evalExpression = expression.Replace("[this]", Convert.ToString(value));
        ///
        /// Now evaluate the expression
        /// 
        DataTable loDataTable = new DataTable();
        double dummyResult;
        DataColumn loDataColumn;
        if (Double.TryParse(evalExpression, out dummyResult))
            loDataColumn = new DataColumn("Eval", typeof(double), evalExpression);
        else
            loDataColumn = new DataColumn("Eval", typeof(string), evalExpression);
        loDataTable.Columns.Add(loDataColumn);
        loDataTable.Rows.Add(0);
        returnValue = (object) loDataTable.Rows[0]["Eval"];
        return true;
    }
    catch (Exception e)
    {
        errorMessge = e.Message.ToString();
        returnValue = 0;
        return false;
    }
}

在示例中调用函数...

.
.
.
.
object val = (object) 12538;
string errorMsg = String.Empty;
object result;
string expr = "[this] & 0x02";
if (!EvaluateExpression (expr, val, result, errorMsg))
{
    Console.WriteLine("Error on expression. Error = " + errorMsg);
}
else
{
    Console.WriteLine("The resulting valur is " + val.ToString();
}

http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression%28v=vs.110%29.aspx这些表达式无法处理按位操作 afaik。

根据@sdf,它们不支持按位运算,但可以使用可用的运算符模拟某些按位运算。例如:

  • [this] & 0x02相当于IIF(Convert([this]/2, 'System.Int32')%2 = 0, 0, 2)
  • [this] | 0x02相当于IIF(Convert([this]/2, 'System.Int32')%2 = 0, [this] + 2, [this])
  • [this] >> 2相当于Convert([this]/4, 'System.Int32')
  • [this] << 2相当于Convert([this]*4, 'System.Int32')

相关内容

  • 没有找到相关文章

最新更新