将字符串转换为包含其他类变量的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表达式从代码的其他地方访问变量

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

我不同意下面的评论,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可以在其他地方解析并插入,但这就是您如何从字符串中获得值。