Estoy buscando una forma de obtener un valor booleano de una cadena.

Tengo una cadena, almacenada en una base de datos, que es una condición con la que se debe probar. supongamos que la cadena = "[número] <10000" En mi código, planeo reemplazar [número] con un número real para que la cadena se convierta en "100 <10000".

¿Existe una forma sencilla de evaluar esta cadena a un booleano? En este caso sería Falso.

Otro ejemplo: "[número]> 100 && [número] <1000" Si el número fuera 200, la evaluación sería Verdadera.

¿Qué pasa si agrego código a esta condición, como "if ([número]> 100 && [número] <1000) {return true;} else {return false;}"

¿Si hay una forma sencilla de obtener el valor de retorno de esta cadena con código?

1
Eric 24 feb. 2018 a las 13:21

2 respuestas

La mejor respuesta

Puede hacer uso de la clase DynamicExpression , está disponible en este paquete nuget. Puede evaluar expresiones sobre la marcha.

A continuación hay un ejemplo,

var expression = System.Linq.Dynamic.DynamicExpression.ParseLambda(
            new System.Linq.Expressions.ParameterExpression[] { },
            typeof(bool),
            "100 > 1000",
            new object[] { });
        var compiledDelegate = expression.Compile();
        var result = compiledDelegate.DynamicInvoke(null);

El resultado será falso ya que la expresión proporcionada "100> 1000" es falsa.

2
Karthik AMR 24 feb. 2018 a las 10:57

Si necesita más control, debe crear expresiones en función de cadenas dinámicas que representen operaciones lógicas. Por ejemplo, he tomado su primer caso de "[number]<1000". Puede probar a continuación:

 static void Main(string[] args)
        {
            string code = "[number] < 10000".Replace("[number]", "100");
            string[] operands = code.Split('<');
            var comparison = Expression.LessThan(
              Expression.Constant(operands[0]),
              Expression.Constant(operands[1]));
            var lambda = Expression.Lambda<Func<bool>>(comparison).Compile();
            bool result = lambda();

        }

O alternativamente, puede usar bibliotecas existentes o paquetes nuget para hacer lo mismo de una manera más simple (aunque bajo el capó hacen lo mismo) :

 string code = "[number] < 10000".Replace("[number]", "100");
    func = ExpressionParser.Compile<Func<bool>>(code);
    bool result = func()

Hace uso del analizador Lambda como se muestra aquí

1
rahulaga_dev 24 feb. 2018 a las 11:34