Используйте Microsoft Scripting Control для оценки выражений «если» (через c #) - PullRequest
0 голосов
/ 05 апреля 2009

У меня есть некоторый код на c #, который использует 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" в порядке

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

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

RH

Ответы [ 5 ]

3 голосов
/ 05 апреля 2009

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

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

Добавьте функцию к элементу управления и затем используйте Run

Result = ScriptControl.Run("Test")

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

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

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

1 голос
/ 01 сентября 2012
using MSScriptControl; // references msscript.ocx

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

// VBScript engine doesn’t have IIf function
// Adding wraper IIF function to script control.
// This IIF function will work just as VB6 IIf function.
sc.AddCode(@"Function IIF(Expression,TruePart,FalsePart)
                If Expression Then
                    IIF=TruePart
                Else
                    IIF=FalsePart
                End IF
            End Function");
try
{
    //define x,y variable with value
    sc.AddCode(@"x=5
                y=6");
    //test our IIF 
    Console.WriteLine(sc.Eval("IIF(x>y,x,y)").ToString());
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}
1 голос
/ 05 апреля 2009
if (true) then return 2 else return 3
1 голос
/ 05 апреля 2009

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

0 голосов
/ 06 апреля 2009

Спасибо за советы! После нескольких экспериментов, основанных на помощи Бруммо, похоже, что это работает:

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

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

тогда

sc.AddCode (txtEx.Text); * * 1 008

и

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...