C# 使用位运算符的DataColumn类不起作用

C# 使用位运算符的DataColumn类不起作用,c#,math,datacolumn,C#,Math,Datacolumn,我有一个DataColumn实现来在运行时计算表达式。令我惊讶的是,DataColumn操作似乎不支持按位运算符 需要检查单个位集或组位集。示例: (值&0x0002)检查第二位设置。应返回true(1) ((Value&0x000F)==0x03)检查值的前4位的值是否为3 有没有办法使用DataColumn类来支持这些按位操作 是否有支持按位操作的DataColumn替代方案 关于如何使用常用数学运算符的建议 [编辑-完成功能代码] public static bool EvaluateEx

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

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

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

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

有没有办法使用DataColumn类来支持这些按位操作

是否有支持按位操作的DataColumn替代方案

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

[编辑-完成功能代码]

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

这些表达式不能处理按位操作。

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

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

  • [this]我们可以再看一些代码吗?如何设置
    ?什么是
    ?发布的代码。对于所有常见的数学运算,该函数都可以正常工作一段时间,但我现在需要支持的位运算符除外。[此]更改为给定值。值只是为了说明一些值。来吧,发布的代码甚至没有尝试按位运算。很抱歉您不理解。按位操作是在运行时生成的。比如:EvaluateExpression(“[this]&0x03”,(object)12,我们的结果,out error)。。。这就是为什么最初的问题不包含代码…这就是我现在发现的。所以,我需要使用数学运算符或其他方法来更改它。有什么建议吗?为什么要为此使用DataColumn类?也许你应该这样做:原因是这是一个非常简单的代码,没有额外的库。C#解析器要复杂得多,我真的需要只支持简单的操作,而不是语言解析器。我们不久前就这样做了,而且效果很好。问题是,现在我需要支持位,但它不支持。。。我需要一个简单的方法…+这个,但是OP必须先解析字符串,然后再将其填充到DataColumn中,得到他将使用的操作并替换这些操作。在他解析字符串以获取操作符号时,获取args并将其传递给执行此操作的本机代码函数可能很简单。也许这就是他从一开始就在做的?是的,当然,除非原始字符串可以修改。他没有说它是从哪里来的……现在解决我的问题是可以接受的,但我认为我需要设计一个新的支持按位的解析器。我正在检查像和这样的帖子。最后一个看起来是完整的和可定制的,但需要一些时间。关于值,表达式可由用户配置,值来自DB数据。我以前不知道,因为每个用户都会有不同的表达式,运行在实时数据库数据上……无法工作。当我们这样做的时候,它把它变成了double,不能被模化为2。所以它引发了一个异常…您是否尝试过转换,如上图所示?然而,解析器并不是那么难,而且绝对是正确的解决方案。