【问题标题】:Is there an equivalent to Expression.Parameter in C# 2.0在 C# 2.0 中是否有等价于 Expression.Parameter
【发布时间】:2015-03-31 09:41:46
【问题描述】:

我之所以这么问,是因为我正在尝试将某些东西移植到使用 C# 2.0 的 unity 中。例如我有这样一行:

var patternSymbol = Expression.Parameter(typeof (T));

那么我可以用一些我自己的代码来代替它吗?注意:我可以随心所欲地改变东西,但离原始代码越远,我可能会遇到越多的工作。本质上,我需要在 C# 2.0 中复制表达式/参数行为(来自 C# 3.0?)。

(我是一个 C# 新手,发现很难找到像现在这样的历史问题的答案)。

【问题讨论】:

  • 不,没有。但是,如果您可以发布该代码对 patternSymbol 的作用,我们可以帮助您在 .Net 2.0 中实现相同的功能。您的编译器错误表明Expression 中没有Parameter 方法,但存在Expression 类;但是.net 2.0 中不应该有Expression 类。你确定你没有收到任何其他错误吗?如果是这样,那个 Expression 类是从哪里来的?
  • 是的。你说得对。几个小时前,我添加了一个空的 Expression 类来实现这一点。愚蠢的我不记得了。我将尝试修改问题以在当前上下文中有意义。谢谢斯里拉姆。
  • 尝试在 .NET 2.0 中重新实现表达式树将是很多的工作。我认为有一个项目在某处做到了这一点,但如果它使用了 Unity 中不可用的 .NET 2.0 的其他方面,我不会感到惊讶。我强烈建议尝试重新设计以不再需要表达式树。
  • 谢谢乔恩。有时你不知道要做多少工作,直到你涉足。我会放弃这种方法。
  • 将表达式(除其他外)反向移植到 .net 2.0 的项目是 Theraot's Libraries。我能够使用它为 .net 2.0 编译 dotNetLiquid,并且他们的所有单元测试都成功通过。如果您对其他有用的反向移植感到好奇,请查看this SO question

标签: c# delegates


【解决方案1】:

您不能将此代码反向移植到 .NET 2.0,因为缺少整个 LINQ 子系统。 System.Linq.Expressions.Expression 类已作为 C# 3.5 的 LINQ 的一部分引入,这是 .NET 框架向前迈出的一大步。

特别是,Expression.Parameter 本身并不是很有用。通常,您会发现Expression.LambdaCompile 在代码的更下方调用,然后是Func<...>。模仿这些调用需要生成 CLR 代码,这几乎就像编写自己的编译器一样。不过,这很少值得付出努力。

您需要了解如何使用旧代码,并从头开始构建替代代码。例如,您可以用解释的表达式替换已编译的表达式,这样更容易构建(以较低的运行时性能为代价)。无论如何,你最终会编写一个全新的子系统,而不是简单地移植代码。

【讨论】:

  • 我担心你会这么说。谢谢大家。
猜你喜欢
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
相关资源
最近更新 更多