将字符串转换为包含其他类的变量的lambda表达式

时间:2015-07-30 17:38:00

标签: c# string parsing lambda linq-expressions

我一直试图做的是转换表单的字符串

"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表达式访问变量

2 个答案:

答案 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)可以在别处解析并插入,但这是您从字符串中获取值的方法。