是否有表示运算符类型的.NET类?
问题描述:
我想做到以下几点:是否有表示运算符类型的.NET类?
*OperatorType* o = *OperatorType*.GreaterThan;
int i = 50;
int increment = -1;
int l = 0;
for(i; i o l; i = i + increment)
{
//code
}
这个概念可以使用JavaScript中的eval()函数来kludged ......只是这种想法是有一个循环 可以向前或向后基于价值在运行时设置。
这是可能的吗?
感谢
答
是的,它在.NET Expression trees.具体而言,您需要使用BinaryExpression.Add()。构建表达式树不需要手工完成,编译器会很乐意将它看到的任何lambda表达式转换为Expression<T>
转换为有效的表达式树。
// Creating an expression tree.
Expression<Func<int, int, bool>> greaterThan = (l, r) => l > r;
int i = 50;
int increment = -1;
int l = 0;
for(i; greaterThan(o, i); i = i + increment)
{
//code
}
调用表达式树会自动将其编译为动态方法,并且greaterThan将像代理一样有效地执行。
答
Func<int,int,bool> op = (i1, i2) => i1 > i2;
然后
op(i, l);
答
编辑:增加了一个具有lambda表达式:
Func<int, int, bool> lessThan = (num1, num2) => num1 < num2;
Func<int, int, bool> greaterThan = (num1, num2) => num1 > num2;
public void Run()
{
int increment = -1;
int l = 0;
Func<int, int, bool> c = lessThan;
for (int i = 50; c(i, l); i = i + increment)
{
}
}
我相信人们会想出比这更优雅的解决方案,但在这里它是:
public enum Comparison
{
GreaterThan,
LessThan
}
public bool Compare(int a, Comparison c, int b)
{
if (c == Comparison.GreaterThan)
return a > b;
else if (c == Comparison.LessThan)
return a < b;
else
throw new ArgumentException();
}
public void Run()
{
int i = 50;
int increment = -1;
int l = 0;
Comparison c = Comparison.GreaterThan;
for (i; Compare(i, c, l); i = i + increment)
{
}
}
答
Func<int, int, bool> o = (x, y) => x > y;
int i = 50;
int increment = -1;
int l = 0;
for(; o(i, l) ; i = i + increment)
{
//code
}
或得到完全摆脱升:
Predicate<int> o = (x) => x > 0;
int i = 50;
int increment = -1;
for(; o(i) ; i = i + increment)
{
//code
}
答
您可以定义自己的类,并实现自己的运营商,看到http://msdn.microsoft.com/en-us/library/aa288467(VS.71).aspx
--edited
哦,误解你想要的东西时,对你来说最好的方法就是用安德烈的表情或者表情。
什么原因使用表达式而不是只是普通的Func委托? –
fearofawhackplanet
2010-05-04 17:53:14
使用func只会创建一个绑定到委托的匿名函数。它将在编译时构建。另一方面,将lambda分配给Expression会导致编译器发出可在运行时操作的表达式树。匿名方法不能。 – 2010-05-05 08:02:09