2014-01-03 10 views
1

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

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

(Value & 0x0002) для проверки наличия второго набора бит. Вернуть true (1).

((Value & 0x000F) == 0x03), чтобы проверить, если первые 4 бита Значение имеет значение 3.

Есть ли способ, чтобы поддержать эти битовые операции с использованием класса DataColumn?

Есть ли альтернатива DataColumn, которая поддерживает побитовые операции?

Предложения о том, как это сделать, используя общие математические операторы?

[EDIT - Полный код функции]

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

Можем ли мы увидеть больше какой-то код? – geedubb

+0

Как вы устанавливаете 'Value'? Что такое «Ценность»? –

+0

Отправленный код. Функция работает отлично в течение некоторого времени для всех общих математических операций, за исключением побитовых операторов, которые мне нужно поддерживать сейчас. [this] изменяется на заданное значение. Значение было просто для иллюстрации некоторой ценности. – Mendes

ответ

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')
+0

+ Это, но OP, придется разбирать строку, прежде чем набивать ее в DataColumn, и получить, какую операцию он собираются использовать и заменять их.В тот момент, когда он разбирал строку, чтобы получить символ операции, было бы, вероятно, просто получить аргументы, а также передать это на нативную функцию кода, которая делает это. Может быть, это то, что он делал с самого начала? – sdf

+0

Да, если, конечно, исходная строка не может быть изменена. Он не сказал, откуда он ... –

+0

Теперь можно решить мою проблему, но я предвижу, что мне нужно создать новый парсер, который поддерживает поразрядный. Я проверяю сообщения, например [link] (http://stackoverflow.com/questions/355062/is-there-a-string-math-evaluator-in-net/392355#392355) и [ссылка] (http://www.codeproject.com/Articles/18880/State-of-the-Art-Expression-Evaluation). Последний сидит вполне и настраивается, но займет некоторое время. Что касается значений, выражение является настраиваемым пользователем, и значение происходит из данных БД. Я не знаю об этом ранее, поскольку каждый пользователь будет иметь выражения diff, работающие с данными в реальном времени ... – Mendes

2

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

+0

Вот что я узнал сейчас. Поэтому мне нужно изменить его либо с помощью математических операторов, либо с помощью другого метода. Любое предложение ? – Mendes

+0

Почему вы все равно используете класс DataColumn? Возможно, вам стоит попробовать что-то вроде этого: http: //stackoverflow.com/questions/826398/is-it-possible-to-dynamically-compile-and-execute-c-sharp-code-fragments – sdf

+0

Причина в том, что это очень простой код без дополнительных библиотек. C# parser намного сложнее, и мне действительно нужно поддерживать только простые операции, а не парсер. Мы сделали это некоторое время назад, и это работает очень хорошо. Проблема в том, что теперь мне нужно поддерживать поразрядное и не поддерживать ... Мне нужен простой способ ... – Mendes