2016-03-24 13 views
3

Я пытаюсь выполнить некоторый код внутри строки во время выполнения. И.Е.Выполнение динамического кода: String -> Код времени выполнения VB.net

Dim code As String = "IIf(1 = 2, True, False)" 

Как запустить код внутри строки code?

+0

Используйте классы компилятора ** CodeDom **. https://msdn.microsoft.com/en-us/library/microsoft.visualbasic.vbcodeprovider(v=vs.110).aspx У меня есть обертка, которую вы можете анализировать: https://github.com/ElektroStudios/ElektroKit /blob/master/Solution/v1.5/Elektro.Interop/Types/VisualBasicCompiler.vb Если вы хотите оценить только арифметические выражения, я предлагаю использовать библиотеку ** NCalc **: https: //ncalc.codeplex .com/(поскольку оценщик JS от Microsoft устарел). Кроме того, вы должны использовать ** IF() ** вместо ** IIF() **. – ElektroStudios

+0

Спасибо. Думаю, я попробую использовать CodeDom с помощью этого метода: http://stackoverflow.com/questions/21379926/load-vb-net-code-from-txt-file-and-execute-it-on-fly -using-system-codedom-compi – Developer

ответ

1

Как сказал @ElektroStudios - правильный способ сделать это - использовать CodeDom compiler, но это немного избыточно для чего-то простого.

Вы можете сортировать обманывать и использовать власть в DataColumn Expression

Так, например:

Dim formula = "IIF(Condition = 'Yes', 'Go', 'Stop')" 
    Dim value As String = "Yes" 
    Dim result As String 

    'add a columns to hold the value 
    Dim colStatus As New DataColumn 
    With colStatus 
     .DataType = System.Type.GetType("System.String") 
     .ColumnName = "Condition" 
    End With 

    'add a column to compute the expression 
    Dim colExp As New DataColumn 
    With colExp 
     .DataType = System.Type.GetType("System.String") 
     .ColumnName = "Expression" 
     .Expression = formula 
    End With 

    'create a table and add the columns 
    Dim dt As New DataTable 
    With dt.Columns 
     .Add(colStatus) 
     .Add(colExp) 
    End With 

    'now add a row and set the condition to the value we have 
    Dim row As DataRow = dt.NewRow 
    row.SetField(Of String)("Condition", value) 
    dt.Rows.Add(row) 

    'now read back the computed value based on the expression being evaluated 
    result = row.Field(Of String)("Expression") 
    MessageBox.Show(result) 

Вы можете обернуть все это вверх в более общей функции, как это:

Public Function EvaluateExpression(Of T, K)(input As T, formula As String) As K 
    'add a columns to hold the value 
    Dim colStatus As New DataColumn 
    With colStatus 
     .DataType = GetType(T) 
     .ColumnName = "Condition" 
    End With 

    'add a column to compute the expression 
    Dim colExp As New DataColumn 
    With colExp 
     .DataType = GetType(K) 
     .ColumnName = "Expression" 
     .Expression = formula 
    End With 

    'create a table and add the columns 
    Dim dt As New DataTable 
    With dt.Columns 
     .Add(colStatus) 
     .Add(colExp) 
    End With 

    'now add a row and set the condition to the value we have 
    Dim row As DataRow = dt.NewRow 
    row.SetField(Of T)("Condition", input) 
    dt.Rows.Add(row) 

    'now read back the computed value based on the expression being evaluated 
    Return row.Field(Of K)("Expression") 
End Function 

Итак, вы можете называть это следующим образом:

Dim result = EvaluateExpression(Of Integer, Boolean)(1, "IIF(Condition = 1, True, False)") 
+1

Используя выражение datacolumn, это действительно интеллектуальное решение, которое я никогда раньше не видел. спасибо за это. Я отметил, что для строк пользователю необходимо предоставить одну цитату вместо двойной кавычки в условии. (** Условие = 'строка' **), просто я хотел прокомментировать это, потому что я спрашивал меня, почему побег с двойной кавычкой был в порядке, тогда я попытался с одной цитатой. – ElektroStudios