为了账号安全,请及时绑定邮箱和手机立即绑定

使用表达式作为字符串生成 Action<T>

使用表达式作为字符串生成 Action<T>

C#
九州编程 2021-11-21 14:59:10
我试图弄清楚如何从代表动作“语句”行的字符串集合中生成一个动作......using System.Linq.Dynamic;Action<T> BuildAction<T>(T sourceObject, T destinationObject) where T : BaseThing{    var source = Expression.Parameter(sourceObject.GetType(), "source");    var destination = Expression.Parameter(destinationObject.GetType(), "destination");    var statements = new[] {        "destination.Foo = source.Foo",        "destination.X = source.Y"    };    var parsedStatements = statements.Select(s => DynamicExpression.Parse(new[] { destination, source }, typeof(void), s);    return Expression.Lambda<Action<T>>(Expression.Block(parsedStatements));}这个想法是最终得到类似......Action<T> result = (destination, source) => {     destination.Foo = source.Foo;     destination.X = source.Y;};我的另一个问题是源和目标不必是相同的类型,它们只共享一个基类型,所以在这个例子中,目标可能没有 Y 属性,源可能没有 X 属性(因此映射)。
查看完整描述

1 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

所以事实证明,这个问题的答案并不像我希望的那么简单。简而言之......我需要编写一个表达式解析器。

对于最简单的情况(问题中提出的情况),我可以在我的部分解决方案中使用代码,但对于完整的解决方案,我将不得不构建一个表达式解析器,该解析器可以处理放入字符串中的更多复杂性.

就我而言,使用字典或类似方法只能解决一部分潜在问题,我不能使用反射,因为我的情况需要“大规模重用已编译的操作”(我在问题中略有提及)。

我可以参考一系列问题的答案来解决这个问题的各个部分,但我设法找到了一个更“完整”的起点,以实现我在其他地方尝试实现的目标......

https://archive.codeplex.com/?p=simproexpr

...这个例子不仅可以解析表达式,还可以解析表达式块。

使用那个/类似的东西,我将沿着这些方向构建一些东西来解决我的问题,我希望这可以帮助其他人。


查看完整回答
反对 回复 2021-11-21
  • 1 回答
  • 0 关注
  • 174 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信