将字符串转换为包含来自其他 类 的变量的 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.
下面列出了您可能想了解的关于我的示例代码的有用信息:
StudentDatabase class 是一个静态 class 包含静态字段 avgHeight.
我已经完成了解析字符串的代码部分,因此无需将其包含在任何提供的解决方案中。
这只是一个示例,您可以根据需要更改字符串和 variable/class 名称。
这 不是 作业,因此请随时查看 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
是对还是错?如果你希望它是真的,那么你还有更多的工作要做。
我一直在尝试将 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.
下面列出了您可能想了解的关于我的示例代码的有用信息:
StudentDatabase class 是一个静态 class 包含静态字段 avgHeight.
我已经完成了解析字符串的代码部分,因此无需将其包含在任何提供的解决方案中。
这只是一个示例,您可以根据需要更改字符串和 variable/class 名称。
这 不是 作业,因此请随时查看 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
是对还是错?如果你希望它是真的,那么你还有更多的工作要做。