我想做以下事情:
*OperatorType* o = *OperatorType*.GreaterThan;
int i = 50;
int increment = -1;
int l = 0;
for(i; i o l; i = i + increment)
{
//code
}
这个概念可以使用eval()在javascript中进行克制...但是这个想法是有一个循环 可以根据运行时设置的值前进或后退。
这可能吗?
由于
答案 0 :(得分:13)
是的,它在.NET中Expression trees.具体来说,您需要使用BinaryExpression.Add()。构建表达式树不需要手工完成,编译器将乐于将它看到分配给Expression<T>
的任何lambda表达式转换为有效的表达式树。
// 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
}
调用表达式树会自动将其编译为动态方法,而且更有效的方法就像委托一样。
答案 1 :(得分:4)
Func<int,int,bool> op = (i1, i2) => i1 > i2;
然后
op(i, l);
答案 2 :(得分:2)
编辑:添加一个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)
{
}
}
答案 3 :(得分:1)
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
}
或完全摆脱l:
Predicate<int> o = (x) => x > 0;
int i = 50;
int increment = -1;
for(; o(i) ; i = i + increment)
{
//code
}
答案 4 :(得分:0)
您可以定义自己的类并实现自己的运算符,请参阅http://msdn.microsoft.com/en-us/library/aa288467(VS.71).aspx
- 编辑
哦,误解了你想要的东西,最好的方法是使用表达式或Func&lt;&gt;安德烈伤心。