我一直试图做的是转换表单的字符串:
"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 而不是 Expression
以下是您可能想了解我的示例代码的有用内容的列表:
StudentDatabase 类是一个包含静态字段 avgHeight 的静态类。
我已经完成了解析字符串的部分代码,因此无需在任何提供的解决方案中包含它。
这只是一个示例,因此您可以根据需要更改字符串和变量/类名称。
这是不一项作业,所以请随意发布源代码。事实上,这将是非常感激的。
TL; DR; 我尝试做的是从代码的其他位置使用 LINQ表达式来访问变量
答案 0 :(得分:1)
我不同意以下评论,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
应该是真还是假?如果你想要它是真的,那么你还有更多工作要做。
答案 1 :(得分:0)
我已经将其创建为一种可以解决的框架。它不使用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
)可以在别处解析并插入,但这是您从字符串中获取值的方法。