Я пытаюсь выполнить некоторый код внутри строки во время выполнения. И.Е.Выполнение динамического кода: String -> Код времени выполнения VB.net
Dim code As String = "IIf(1 = 2, True, False)"
Как запустить код внутри строки code
?
Я пытаюсь выполнить некоторый код внутри строки во время выполнения. И.Е.Выполнение динамического кода: String -> Код времени выполнения VB.net
Dim code As String = "IIf(1 = 2, True, False)"
Как запустить код внутри строки code
?
Как сказал @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)")
Используя выражение datacolumn, это действительно интеллектуальное решение, которое я никогда раньше не видел. спасибо за это. Я отметил, что для строк пользователю необходимо предоставить одну цитату вместо двойной кавычки в условии. (** Условие = 'строка' **), просто я хотел прокомментировать это, потому что я спрашивал меня, почему побег с двойной кавычкой был в порядке, тогда я попытался с одной цитатой. – ElektroStudios
Используйте классы компилятора ** 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
Спасибо. Думаю, я попробую использовать CodeDom с помощью этого метода: http://stackoverflow.com/questions/21379926/load-vb-net-code-from-txt-file-and-execute-it-on-fly -using-system-codedom-compi – Developer