У меня есть реализация DataColumn для оценки выражений во время выполнения. К моему удивлению, операции DataColumn не поддерживают побитовые операторы.

При необходимости проверить индивидуальный набор бит или набор групп бит. Примеры:

(Value & 0x0002) для проверки установки 2-го бита. Вернет 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();
}
1
Mendes 3 Янв 2014 в 17:44

2 ответа

Лучший ответ

Согласно @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')
1
Dark Falcon 3 Янв 2014 в 17:26

http: // msdn .microsoft.com / en-us / library / system.data.datacolumn.expression% 28v = vs.110% 29.aspx Эти выражения не могут обрабатывать побитовые операции afaik.

2
sdf 3 Янв 2014 в 14:10