【问题标题】:Check if condition in string format in c#在c#中检查条件是否为字符串格式
【发布时间】:2015-12-07 14:53:16
【问题描述】:

我不确定天气是否可能,但我必须以某种方式在我的项目中做到这一点。 我得到一个字符串格式的条件,例如:

string condition = "(param1='69' OR param1='66' OR param1='21' OR param1='93') AND (param2='FL' OR param2='WA) AND (param3!='31' AND param3!='19')";

我从 db 得到的这个条件,我的代码中有 param1、param2 和 param3 的值。现在我必须在 if 语句中检查这个条件,判断它是真还是假,并相应地显示结果。

我尝试将 param1、param2、param3 替换为实际值,比如 69、CA、22。所以字符串看起来像:

condition = "(69='69' OR 69='66' OR 69='21' OR 69='93') AND (CA='FL' OR CA='WA) AND (22!='31' AND 22!='19')";

并尝试将其转换为布尔值,但它不起作用。

请让我知道是否有任何方法,否则我需要对其进行硬编码? 还有一件事,条件可能很像,有时它会带有 2 个变量,有时会带有 4 个变量。

【问题讨论】:

  • 更进一步的做法是将所有= 更改为==,除非它们是!= 的一部分;然后所有OR|| 和所有AND&&。然后你“只”需要将该字符串作为表达式进行评估......也许这会有所帮助:stackoverflow.com/questions/53844/…
  • 另外,您可能希望将参数值括在单引号中以匹配这些值。所以condition = condition.Replace("param1", "'" + param + "'");

标签: c# string if-statement c#-4.0 conditional-statements


【解决方案1】:

C#(和其他已编译的 .NET 语言)不是“JIT”、解释性语言,也不会进行自动类型转换(数字!= 字符串)。如果要在 C# 中进行,则必须自己分析和处理字符串。

但是...由于您已经在使用数据库,并且看起来它处理 SQL,您可以简单地将任务委托给数据库并获取最终结果而不是条件字符串。

调用一个存储过程,它接受您的参数和查询字符串的键并让它返回布尔结果,或者在您创建的注入字符串(在注入参数值之后)前面加上 SELECT 并使用数据库处理它再次引擎。只需确保您知道要注入危险的用户输入,否则您将面临 SQL 注入攻击。

【讨论】:

    【解决方案2】:

    如果您确实需要在应用程序中测试条件并且可以进一步修改条件字符串,我可以建议使用DataTable 进行破解。 DataTable 可以评估你的字符串:

    demo

    public class Program
    {
        public static void Main(string[] args)
        {
            // modified string !
            // "!=" -> "<>"; CA -> 'CA'
            string condition = "('69'='69' OR '69'='66' OR '69'='21' OR '69'='93') AND ('CA'='FL' OR 'CA'='WA') AND ('22'<>'31' AND '22'<>'19')";           
            Console.WriteLine(TestCondition(condition));
            // print FALSE because ('CA'='FL' OR 'CA'='WA') is FALSE
        }
    
        public static bool TestCondition(string c)
        {
            var dt = new DataTable();
            dt.Columns.Add("col");
            dt.Rows.Add("row");
            // hack
            // c is constant and doesn't depend on dt columns
            // if there are any rows, c is TRUE
            var rows = dt.Select(c);
            return rows.Length > 0;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-11
      • 2015-12-28
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多