我有一个DataColumn实现来在运行时计算表达式。令我惊讶的是,DataColumn操作肯定不支持按位运算符。
需要检查各个位集或位组。例子:
(Value & 0x0002)
检查第二位设置。应该返回true(1)。
((Value & 0x000F) == 0x03)
检查Value的前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();
}
答案 0 :(得分:2)
http://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression%28v=vs.110%29.aspx 这些表达式无法处理按位运算。
答案 1 :(得分:1)
根据@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')