将字符串转换为包含其他类变量的lambda表达式
本文关键字:类变量 lambda 表达式 其他 包含 字符串 转换 | 更新日期: 2023-09-27 18:05:31
我一直在尝试做的是转换字符串的形式:
"StudentDatabase.avgHeight > 1.7"
到lambda表达式,看起来像这样:
() => StudentDatabase.avgHeight > 1.7;
我尝试了以下几行:
/* String splitting and parsing occurs here */
var comparison = Expression.GreaterThan(
Type.GetType("MyNamespace.StudentDatabase").GetField("avgHeight"),
Expression.Constant(1.7)
);
var lambda = Expression.Lambda<Func<bool>>(comparison).Compile();
当然像这样的不能工作,因为GetField()方法返回类型FieldInfo而不是表达式。
关于我的示例代码,这里列出了一些你可能想知道的有用的东西:
StudentDatabase类是一个静态类,包含静态字段avgHeight。
我已经完成了解析字符串的那部分代码,所以没有必要在任何提供的解决方案中包含它。
这只是一个例子,如果你愿意,你可以改变字符串和变量/类的名字
这是而不是,所以请随意发布源代码。事实上,这将是非常感激的。
TL;DR;我想做的是使用LINQ表达式来从代码的其他地方访问变量
我不同意下面的评论,Linq表达式是做这类事情的可行方法。下面的代码完成了它。但是,请考虑以下代码:
namespace MyNamespace
{
class Program
{
static void Main(string[] args)
{
/* String splitting and parsing occurs here */
var comparison = Expression.GreaterThan(
Expression.Field(null, Type.GetType("MyNamespace.StudentDatabase").GetField("avgHeight")),
Expression.Constant(1.7)
);
var lambda = Expression.Lambda<Func<bool>>(comparison).Compile();
StudentDatabase.avgHeight = 1.3;
var result1 = lambda(); //is true
StudentDatabase.avgHeight = 2.0;
var result2 = lambda(); //is false
}
}
class StudentDatabase
{
public static double avgHeight = 1.3;
}
}
result2
是真还是假?如果你希望它是真的,那么你还有更多的工作要做。
我创建了这个作为一种框架,你可以工作。它不使用LINQ,但会输出字符串指定的值。
var type = Type.GetType("MyNamespace.StudentDatabase");
if (type != null)
{
var field = type.GetField("avgHeight");
if (field != null)
{
Func<bool> lambda = () => (double)field.GetValue(type) > 1.7;
}
}
有一些错误检查,你可以添加/删除。其他区域,如>
和1.7
可以在其他地方解析并插入,但这就是您如何从字符串中获得值。