Evaluar una regla

Tengo una mesa como la siguiente:

paso de regla

StepID | Step Property | Step Condition Id | Step Value | Logical Operator | Next Step Id

Una de las filas podría ser la siguiente: 100, Nombre, 200 (que significa igual), AnyName, 210 (que significa Y), 300 (apunta a la siguiente identificación del paso).

Lo anterior significa que debería estar evaluando una regla que tiene un paso que dice que el Nombre debe ser igual a CualquierNombre y el siguiente paso está encadenado por el operador AND. El siguiente paso podría ser decir: la edad debe ser igual a 10.

Estas reglas deben evaluarse contra un objeto Persona con 2 propiedades Edad y Nombre. Tengo que verificar si el nombre de la persona es CualquierNombre y la Edad es 10.

¿Puede por favor decirme cómo hago esto? ¿Hay alguna biblioteca que pueda soportar esto? ¿Hay alguna funcionalidad específica dentro de C# que pueda ayudarme?

Gracias, - Mike

preguntado el 12 de junio de 12 a las 07:06

¿Las reglas se almacenan en forma normal disyuntiva (o conjuntiva)? Si no, ¿cómo lidia con las reglas que mezclan And y Or ¿operadores logicos? -

Aprovechando el LogicalOperator y el ID del siguiente paso. Un paso es una regla independiente, y entre los pasos hay un operador lógico, que debe usarse para evaluar el siguiente paso. -

Lo que significa que tus reglas se acumulan como (((((a op b) op c) op d) op e) op f) sin que importe a-f son cada paso, y op¿Están ocurriendo los operadores lógicos entre ellos? - que puede ser difícil forzar todas las condiciones que desee expresar en tal forma. -

3 Respuestas

¿Hay alguna funcionalidad específica dentro de C# que pueda ayudarme?

Sí hay. Puedes construir un Árbol de expresiones LINQ de los datos en su tabla, compilarlo dinámicamente en un objeto de función, y ejecutar la resultante lambda contra su objeto de destino. La biblioteca toma un poco de tiempo para acostumbrarse, pero las construcciones que obtiene son muy poderosas y extremadamente rápidas, por lo que la recompensa por dedicar tiempo a aprender es realmente enorme.

Respondido el 12 de junio de 12 a las 07:06

Puedes probar el PredicateBuilder from the LinqKit paquete, disponible a través de NuGet.

Respondido el 12 de junio de 12 a las 07:06

Ejemplo rápido y sucio usando la reflexión:

bool CheckEqualityRule (object target, string propertyName, string testValue)
{
    var property = target.GetType().GetProperty(propertyName);
    var value = (string)property.GetValue(target, null);
    return value == testValue;
}

Respondido el 12 de junio de 12 a las 07:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.