Как использовать строку "*" или "\" в качестве математических операторов? - PullRequest
4 голосов
/ 17 сентября 2010

Я хочу использовать «*» или «\» в качестве математических операторов как таковых:

«Я собираюсь уточнить»

dim tbox as textbox
tbox.text = "*"

dim i as integer = 8 tbox.text 3

"End Clarify"

dim [mult] as string = "*"
dim [div] as string = "\"


dim i as integer = 8 [mult] 3

, и результатом будет i, равное 24

или

dim i as integer = 8 [div] 2 

, и результатом будет iравно 4

Кто-нибудь может решить эту проблему в одной строке, не создавая длинную, сложную функцию?Я также хотел бы, чтобы это было чем-то, что уже является частью структуры VB.NET и не требует импорта.

Если такого решения не существует, как мне сделать это с помощью функции или импорта .dll?

Ответы [ 6 ]

6 голосов
/ 17 сентября 2010

Вставьте это туда, где вы хотите оценить.

dim [mult] as string = "*"
dim [div] as string = "\"


'dim i as integer = 8 [mult] 3

op = mult

dim i As Integer = Eval("8" & op & "3")

'i is your result


  Private Function Eval(ByVal command As String) As Object
    Dim MyProvider As New VBCodeProvider 'Create a new VB Code Compiler
    Dim cp As New CodeDom.Compiler.CompilerParameters     'Create a new Compiler parameter object.

    cp.GenerateExecutable = False        'Don't create an object on disk
    cp.GenerateInMemory = True           'But do create one in memory.

    'If cp.OutputAssembly is used with a VBCodeProvider, it seems to want to read before it is executed. 

    'See C# CodeBank example for explanation of why it was used.



    'the below is an empty VB.NET Project with a function that simply returns the value of our command parameter.

    Dim ClassName As String = "class" & Now.Ticks

    Dim TempModuleSource As String = "Imports System" & Environment.NewLine & _
                                     "Namespace ns " & Environment.NewLine & _
                                     "    Public Class " & ClassName & Environment.NewLine & _
                                     "        Public Shared Function Evaluate()" & Environment.NewLine & _
                                     "            Return (" & command & ")" & Environment.NewLine & _
                                     "        End Function" & Environment.NewLine & _
                                     "    End Class" & Environment.NewLine & _
                                     "End Namespace"

    'Create a compiler output results object and compile the source code.

    Dim cr As CodeDom.Compiler.CompilerResults = MyProvider.CompileAssemblyFromSource(cp, TempModuleSource)

    If cr.Errors.Count > 0 Then

      'If the expression passed is invalid or "", the compiler will generate errors.

      'Throw New ArgumentOutOfRangeException("Invalid Expression - please use something VB could evaluate")
      Return Nothing
    Else

      'Find our Evaluate method.
      Dim methInfo As Reflection.MethodInfo = cr.CompiledAssembly.GetType("ns." & ClassName).GetMethod("Evaluate")

      'Invoke it on nothing, so that we can get the return value
      Return methInfo.Invoke(methInfo, New Object() {})
    End If
  End Function
5 голосов
/ 17 сентября 2010

Может ли кто-нибудь решить это в одной строке, не создавая длинную, сложную функцию?

Возможно, да, но я думаю, что небольшая функция намного лучше:

Function Compute(a as integer, oper as String, b as integer) as integer
  If oper = "*" Then
    return a*b
  ElseIf oper = "\" Then
    Return a\b
  Else
    Throw New InvalidOperationException()
  End If
End Function

Если вам действительно нужен однострочник, вы можете использовать функцию If():

Dim i As Integer = If(oper = "*", a*b, a\b)

Это не проверит недействительные операторы.

5 голосов
/ 17 сентября 2010

Вы можете использовать CodeDom для оценки выражений.Выражение в вашем примере будет "8 * 3" или "8" + tbox.Text + "3".

Вот пример того, как это сделать в VB.NETЭта функция, конечно, больше, чем одна строка, но ее вызов будет простым.

3 голосов
/ 02 октября 2010

Это сбивает с толку, вы говорите, что хотите использовать умножение и деление в качестве операторов в VB.NET?

Можно выполнить с dim i как целое число = 8 * 9

2 голосов
/ 17 сентября 2010

Вы можете оценить целую строку, например, "8 * 3", используя ScriptControl:

http://www.devx.com/vb2themax/Tip/18773

Довольно опасно, хотя ... вам нужно будет тщательно дезинфицировать любой пользовательский вводчтобы убедиться, что они пытаются только по математике.

0 голосов
/ 28 апреля 2012

Мне нужно было знать, чтобы сделать то же самое, и затем друг нашел правильный способ сделать это, используя «Microsoft Script Control 1.0», чтобы узнать, как его использовать, перейдите по этой ссылке:

http://www.devx.com/vb2themax/Tip/18773

Я вижу это лучше, чем любой другой способ: -).

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