Vb.net 对IF语句条件使用字符串

Vb.net 对IF语句条件使用字符串,vb.net,erp,Vb.net,Erp,我希望有人能帮助回答我的问题,也许能告诉我该去哪里,或者我想做的事情是否不可能以我想要的方式去做 我被要求根据我们的ERP表单组件或变量所持有的数据编写一组规则 不幸的是,这些组件和变量不能在ERP之外访问或使用,因此我不能使用SQL来查询值,然后构建某种SQL查询 他们希望能够将以下语句: C(MyComponentName) = C(MyOtherComponentName) V(MyVariableName) > 16 (C(MyComponentName) = "") AND V(

我希望有人能帮助回答我的问题,也许能告诉我该去哪里,或者我想做的事情是否不可能以我想要的方式去做

我被要求根据我们的
ERP
表单组件或变量所持有的数据编写一组规则

不幸的是,这些组件和变量不能在
ERP
之外访问或使用,因此我不能使用
SQL
来查询值,然后构建某种
SQL
查询

他们希望能够将以下语句:

C(MyComponentName) = C(MyOtherComponentName)
V(MyVariableName) > 16
(C(MyComponentName) = "") AND V(MyVariableName) <> "")
((C(MyComponentName) = "") OR C(MyOtherComponentName) = "") AND V(MyVariableName) <> "")
显然,这是行不通的,我真的没想到会这么简单

忽略这样一个事实:我必须解析行,提取所需的运算符,从组件或变量(用C或V表示)中提取值——我该怎么做

我看过表达式树,但它们令人困惑,尤其是因为我从未听说过它们,更不用说使用它们了。(-此链接提供了有关C#中表达式树的一些详细信息)

我知道解决这个问题的一个更简单的方法可能是用大量的下拉列表填充表单,这样用户就可以从列表中选择他们想要的内容,或者为特定的搜索条件填写文本框

这不是一件简单的事情,因为
ERP
不允许您在其表单上动态创建控件。您必须手动拖动每个组件,这几乎是无用的,因为我们可能希望每个表单(100+)至少有1个
规则

我想找人告诉我,你不能用你想要的方式来做这件事,我可以告诉我的经理,或者一些提示,也许是一个链接或2,为我指明正确的方向

If (Condition) Then
这是不可能的。无法将存储在字符串中的数据视为代码。虽然上面的语句是有效的,但它不会也不能按您希望的方式运行。相反,
条件
将作为字符串进行计算。(任何不能归结为0的内容都将被视为True;请参阅。)

您尝试的是允许用户动态键入代码以获得结果。我不会说这在VB.Net中本身是不可能的,但它的雄心壮志令人难以置信

相反,我建议明确定义应用程序可以做什么和不能做什么。枚举代码允许的运算符,并生成代码以直接支持每个运算符。例如:

Public Function TestCondition(value1 As Object, value2 As Object, op as string) As Boolean
    Select Case op
        Case "="
            Return value1 = value2
        Case "<"
            Return value1 < value2
        Case ">"
            Return value1 > value2
        Case Else
            'Error handling
    End Select
End Function
Public Function TestCondition(value1作为对象,value2作为对象,op作为字符串)作为布尔值
选择案例op
案例“=”
返回值1=值2
案例“”
返回值1>值2
其他情况
'错误处理
结束选择
端函数

显然,您需要根据您将要处理的变量类型和其他特定需求来定制上述内容,但这种方法应该会为您提供一个可行的解决方案。

对于我的特定需求,使用该库使我能够完成我希望做的大部分工作。易于使用,文档内容非常广泛-也有很多示例。

为什么您不能简单地执行:
如果组件(“MyComponent”).Value=Component(“MyOtherComponent”).Value然后
?您能否评论输入是什么,需要对其执行什么测试,你期望什么样的输出?@TimSchmelter:它是动态的。在脚本编译之前,我不知道他们希望比较什么。他们希望查询的“条目”将存储在ERP本身中。@Mort:输入将是组件/变量的值,可以是数字或字符串,也可以是两者。测试将是用户根据所使用的运算符指定的任何内容。我期望的输出仅为布尔值。简单地说,如果等于真,返回真等等。这有帮助吗?没有简单的解决办法。除了创建自己的表达式解析器之外,还可以通过动态构建表达式树来完成所需的工作,如您提供的链接所示,或者您也可以考虑使用代码DOM来动态编译内存中的一个新程序集,然后执行它。在任何情况下,如果它有效或无效-将更新此评论,以便对其他人有所帮助。
Public Function TestCondition(value1 As Object, value2 As Object, op as string) As Boolean
    Select Case op
        Case "="
            Return value1 = value2
        Case "<"
            Return value1 < value2
        Case ">"
            Return value1 > value2
        Case Else
            'Error handling
    End Select
End Function