¿Es posible convertir una cadena a un operador para su uso en una condición lógica.C# convierte una cadena para su uso en una condición lógica
Por ejemplo
if(x Convert.ToOperator(">") y) {}
o
if(x ">" as Operator y){}
Soy consciente de que esto podría no ser cuestión práctica estándar, por lo tanto, no estoy interesado en las respuestas que me pregunta por qué diablos querría hacer algo como esto.
Gracias de antemano
EDIT: OK estoy de acuerdo, lo justo para dar un poco de contexto.
Tenemos un sistema basado en reflexión y XML. Me gustaría poder decir algo como, por gusto.
<Value = "Object1.Value" Operator = ">" Condition = "0"/>
EDIT: Gracias por sus comentarios, no puedo explicar esto correctamente aquí. Supongo que mi pregunta es respondida por "No se puede", lo cual está absolutamente bien (y lo que pensé). Gracias por tus comentarios.
EDIT: Sod it voy a tener una oportunidad.
Imagine la siguiente
<Namespace.LogicRule Value= "Object1.Value" Operator=">" Condition="0">
Esto hará que se refleja en una clase, por lo que ahora quiero poner a prueba la condición, llamando
bool LogicRule.Test()
Esa es la parte en la que todo iba a necesitar para llegar juntos.
EDIT:
OK, por lo que nunca tras mirar Lambdas o expresiones pensé que iba a tener una mirada después de sugerencias de @ jrista.
Mi sistema permite el análisis de Enumeraciones, por lo que las expresiones son atractivas debido a ExpressionType Enum.
así que creé la siguiente clase para probar la idea:
public class Operation
{
private object _Right;
private object _Left;
private ExpressionType _ExpressionType;
private string _Type;
public object Left
{
get { return _Left; }
set { _Left = value; }
}
public object Right
{
get { return _Right; }
set { _Right = value; }
}
public string Type
{
get { return _Type; }
set { _Type = value; }
}
public ExpressionType ExpressionType
{
get { return _ExpressionType; }
set { _ExpressionType = value; }
}
public bool Evaluate()
{
var param = Expression.Parameter(typeof(int), "left");
var param2 = Expression.Parameter(typeof(int), "right");
Expression<Func<int, int, bool>> expression = Expression.Lambda<Func<int, int, bool>>(
Expression.MakeBinary(ExpressionType, param, param2), param, param2);
Func<int, int, bool> del = expression.Compile();
return del(Convert.ToInt32(Left), Convert.ToInt32(Right));
}
}
Obviamente esto sólo funcionará para Int32 en este momento y los ExpressionTypes básicas, no estoy seguro de que puedo hacerlo genérico? Nunca utilicé expresiones antes, sin embargo, esto parece funcionar.
De esta manera puede entonces ser declarada en nuestro camino XML como
Operation<Left="1" Right="2" ExpressionType="LessThan" Type="System.Int32"/>
No responderé "¿por qué estás haciendo esto?", Pero lo comentaré en su lugar :). No estoy tratando de ser un dolor, solo tengo curiosidad de por qué esto es importante para su aplicación. – JaredPar
@JaredPar: Veo esto todo el tiempo: personas que desean almacenarlo en un archivo db y recuperarlo para utilizarlo en el código más adelante. No significa que sea una buena idea, pero de ahí viene. –
Gracias por la actualización, pero ¿qué quiere hacer con ese XML y qué significa? ¿Desea tener ese ejemplo en un elemento, "q", y hacer "if (Compare (q, x))" para comparar la variable "x" de acuerdo con la condición expresada en el elemento XML? –