Используйте Microsoft Scripting Control для оценки выражений «Если» (через С#)

У меня есть код С#, который использует Microsoft Scripting Control для оценки некоторых выражений:

using MSScriptControl; // references msscript.ocx

ScriptControlClass sc = new ScriptControlClass();
sc.Language = "VBScript";
sc.AllowUI = true;

try
{
    Console.WriteLine(sc.Eval(txtEx.Text).ToString());
}
    catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

(txtEx — простое текстовое поле)

Числовые выражения: "6+4", "cos(34)", "abs(-99)", "round(1.234, 2)" и т.д.

Булевы выражения: "истина или ложь", "1=2" в порядке.

Но как я могу оценить простое «если»? Я пробовал "если (истина, 2, 3)", "iif (истина, 2, 3)", "если (истина), то 2 еще 3" и "если (истина), то 2 еще 3 endif"

Может ли кто-нибудь помочь мне оценить простые условные выражения? Любая помощь высоко ценится!

RH


person Ryan    schedule 05.04.2009    source источник
comment
Этот вопрос очень старый. Вы должны принять один, если это помогло!!   -  person Christian Payne    schedule 19.11.2009


Ответы (3)


Попробуйте обернуть ваше IF-выражение в функцию

Function test
   if (true) then
      return true
   else
      return false
   end if
End function

Добавьте функцию в элемент управления, а затем используйте «Выполнить».

Result = ScriptControl.Run("Test")

(приведенный выше код не тестировался, но что-то в этом роде должно работать)

Проверьте эту ссылку для получения дополнительной информации

http://support.microsoft.com/kb/184740

person Brummo    schedule 05.04.2009

Вам следует рассмотреть возможность использования механизма оценки выражений, который является частью Windows Workflow Foundation. И оценщик, и конструктор для него можно использовать отдельно от WF.

person John Saunders    schedule 05.04.2009

Спасибо за советы! После небольшого эксперимента, основанного на помощи Brummo, это, кажется, работает:

txtEx содержит этот текст:

function test
  if (1=1) then 
    test = true
  else 
    test = false
  end if
end function

тогда

sc.AddCode(txtEx.Text);

а также

object[] myParams = { };
Console.WriteLine(sc.Run("Test", ref myParams).ToString());

Это не идеально, так как я действительно хотел оценить выражение без создания, загрузки и оценки функции. (Я удивлен, что IIF не работает для простой одной строки при оценке).

person Ryan    schedule 06.04.2009