【问题标题】:Add a Value Type independed添加独立的值类型
【发布时间】:2014-02-08 15:31:50
【问题描述】:

我有一种可编写脚本的语言,我可以在其中定义不同的脚本元素。 现在我想在没有明确类型的情况下包括对数学运算符的支持。

我认为 Code 更好地解释了这一点:

var ret = a + b;

其中 a 和 b 是对象,但在运行时它们都是同一类型(例如 int、double 等)...

在不指定每个类型的情况下如何解决这个问题?

【问题讨论】:

  • 您的问题真的不清楚。这是用 C# 还是你自己的语言?您是在尝试制作有效的 C#,还是在实现脚本引擎来执行它?
  • 我在你的代码中看不到明确的类型,只要对象 a 实现 + 并且将接受 b 类型的参数,Bob 是你母亲的妹妹的兄弟
  • 查看operator关键字
  • 我将获得有效的 csharp 代码! a 和 b 是对象类型的 csharp 变量,所以我不能添加它们,但在它们中是可以添加的类型,但我只在运行时知道类型....
  • 为什么你认为你可以让它比 dynamic 更快?你不会的,DLR 已经过大量优化。静态语言当然更快,但是当你想创建一种不使用类型的脚本语言时,它就开始了。

标签: c# object reflection


【解决方案1】:

a 和 b ar csharp 对象类型的变量,所以我不能添加它们,但在它们中是可以添加的类型,但我只在运行时知道类型

运行时绑定的完美案例:

dynamic ret = (dynamic)a + (dynamic)b;

这与ab 具有相同的语义,就像使用确切的运行时类型进行静态类型化一样。

【讨论】:

  • 他会想要手动使用反射并缓存它,否则会很慢。
  • @Some1Pr0 DLR 已经这样做了。它生成专门针对常见类型的运行时代码。性能问题不是问题的一部分。我没有看到任何证据表明此操作是他代码中的热点。
  • 它没有。尝试将动态代码与缓存的反射代码进行基准测试,您会对结果感到惊讶。
  • 是的,你可以走得更快。 DLR 仍然比反射快得多。这还不错。根据我的测量,如果只有一个运行时案例,则静态性能差异为 3 倍。我说的是这个:stackoverflow.com/a/655200/122718
  • 您只需要对每种类型第一次使用反射,这意味着它基本上与在字典中查找方法并正常调用它一样快,这几乎与普通方法调用一样快。
【解决方案2】:

我现在尝试通过

Expression.Add(...

我认为这会奏效。我还通过构建一个属性获取表达式来获得我的“a”值......

【讨论】:

  • 表达式树是静态类型的。它们不适用于动态绑定场景。他们只会拒绝两个 object's 作为输入。
  • 是的,但是我在运行时知道类型,我可以使用 Expression(Constatnt, Type) 来告诉类型...而且我可以缓存表达式,因为类型总是保持相同的!而且我的参数表达式已经有了正确的类型...
猜你喜欢
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多