【发布时间】:2010-10-29 21:07:06
【问题描述】:
是否可以将字符串转换为运算符以用于逻辑条件。
例如
if(x Convert.ToOperator(">") y) {}
或
if(x ">" as Operator y){}
我明白这可能不是标准练习问题,因此我对那些问我为什么要这样做的答案不感兴趣。
提前致谢
编辑:好的,我同意,只是提供一些背景信息。
我们有围绕反射和 XML 构建的系统。为了方便起见,我希望能够说一些类似的话。
<Value = "Object1.Value" Operator = ">" Condition = "0"/>
编辑:感谢您的 cmets,我无法在此处正确解释这一点。我想我的问题得到了“你不能”的回答,这绝对没问题(和我想的一样)。感谢您的 cmets。
编辑:草草了,我要试一试。
想象一下
<Namespace.LogicRule Value= "Object1.Value" Operator=">" Condition="0">
这将反映到一个类中,所以现在我想通过调用来测试条件
bool LogicRule.Test()
这就是所有需要结合在一起的地方。
编辑:
好的,所以我从来没有看过 Lambdas 或 Expressions,我想我会看看 @jrista 的建议。
我的系统允许解析枚举,因此表达式很有吸引力,因为表达式类型枚举。
所以我创建了以下类来测试这个想法:
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"/>
【问题讨论】:
-
我不会回答“你为什么要这样做”,但我会评论它:)。不是想成为痛苦,我只是好奇为什么这对您的应用程序很重要。
-
@JaredPar:我经常看到这种情况:人们希望将其存储在数据库中并检索它以供以后在代码中使用。并不意味着这是一个好主意,但这就是它的来源。
-
感谢您的更新,但您想用该 XML 做什么,它是什么意思?是否要在元素“q”中包含该示例,并根据 XML 元素中表示的条件执行“if (Compare(q,x))”以比较变量“x”?
-
@JaredPar:作为旁注,这是 OperatorCache
/ Dynamic Operator Dispatch 可以解决的问题吗?