Возможно ли преобразовать строку в оператор для использования в логическом условии.
Например
if(x Convert.ToOperator(">") y) {}
или
if(x ">" as Operator y){}
Я понимаю, что это может быть не стандартный вопрос практики, поэтому мне не интересны ответы, которые спрашивают меня, почему, черт возьми, хотел бы сделать что-то подобное.
Заранее спасибо
РЕДАКТИРОВАТЬ: ОК, я согласен, только справедливо дать некоторый контекст.
У нас есть система, построенная вокруг отражения и XML. Я хотел бы иметь возможность сказать что-то вроде, для простоты.
<Value = "Object1.Value" Operator = ">" Condition = "0"/>
РЕДАКТИРОВАТЬ: Спасибо за ваши комментарии, я не могу правильно объяснить это здесь. Я предполагаю, что на мой вопрос отвечает «Вы не можете», что совершенно нормально (и то, что я думал). Спасибо за ваши комментарии.
РЕДАКТИРОВАТЬ: Черт возьми, я собираюсь пойти.
Представьте себе следующее
<Namespace.LogicRule Value= "Object1.Value" Operator=">" Condition="0">
Это будет отражено в классе, поэтому теперь я хочу проверить условие, вызвав
bool LogicRule.Test()
Это та часть, где все это должно было бы собраться вместе.
EDIT:
Хорошо, поэтому, никогда не глядя на Lambdas или Expressions, я подумал, что взгляну на предложения @ jrista.
Моя система позволяет анализировать перечисления, поэтому выражения привлекательны из-за перечисления ExpressionType.
Итак, я создал следующий класс для проверки идеи:
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));
}
}
Очевидно, что сейчас это будет работать только для Int32 и базовых ExpressionTypes, я не уверен, что смогу сделать его универсальным? Я никогда не использовал выражения раньше, однако, похоже, это работает.
Этот способ может быть объявлен в нашем XML-формате как
Operation<Left="1" Right="2" ExpressionType="LessThan" Type="System.Int32"/>