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

Convert string to lambda expression that contains variables from other classes

我一直在尝试将 string 转换为以下形式:

"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()方法returns类型FieldInfo 而不是 Expression.

下面列出了您可能想了解的关于我的示例代码的有用信息:

不是 作业,因此请随时查看 post 源代码。事实上,我们将不胜感激。

TL;DR; 我想做的是使用 LINQ 表达式 访问变量 来自代码的其他地方。

我将其创建为一种您可以使用的框架。它不使用 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;   
    }
}

您可以 add/remove 检查一些错误。 >1.7 等其他区域可以在别处解析并插入,但这是从字符串中获取值的方法。

我不同意以下评论,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 是对还是错?如果你希望它是真的,那么你还有更多的工作要做。