【问题标题】:with dynamic, awkward reflection no more?不再有动态的、尴尬的反思了吗?
【发布时间】:2010-10-23 09:49:40
【问题描述】:

C# 4.0 引入了dynamic 关键字,它将在运行时查找。

这是否意味着我们不再需要尴尬的反思?如果有,你能举个例子吗?

【问题讨论】:

  • 我第一次在 SO 上提问,5 分钟后没有答案!

标签: c# dynamic reflection runtime


【解决方案1】:

Dynamic 将大大有助于解决仅通过名称知道的方法的问题,其中名称是已知的并在编译时固定 - 当然,如果您控制类型,这些方法也可以表示为接口。

在某些情况下dynamic 根本无济于事:

  • 编译时方法名称未知(即从配置/用户输入加载)
  • 对象创建
  • 可能是一些泛型场景

我看到dynamic 的最大用途是:

  • COM 互操作(显然)
  • 通用运算符支持
  • 没有通用界面的鸭子打字
  • DLR 互操作(参见 cmets)

但它绝对不能解决所有反射问题。

【讨论】:

  • 关于泛型场景的要点。对我来说,至少泛型是我的大部分思考发生的地方。在这种情况下,动态将无济于事。但是泛型会解决从方法返回匿名类型的问题吗?
  • dynamic 将使匿名类型的工作变得更容易 - 但老实说,更多的答案是“制作命名类型”。 Re generics - some 泛型可能有效(在测试版之前很难说) - 但我不会假设所有泛型都有效。主要问题将是泛型方法(不是泛型类型,应该可以正常工作,因为类型一旦实现就关闭)。
  • 您应该将 DLR 互操作添加到您的积极用例列表中,因为这在未来的框架中将变得越来越重要。
  • 开源框架Impromptu-Interface封装了很多DLR代码,允许以字符串形式调用方法名,运行性能优于反射,适用于动态对象。
【解决方案2】:

我们仍然会有反射 - 对常规 CLR 对象使用“动态”将调用基于反射的调度程序。

所以 - 我们仍然有反射,但它会更容易做到。

这是一个例子:

// Via 'dynamic'    
dynamic dx = GetSomeCLRObject();
dx.DoSomething();
dx.SomeMember = 2;

// Via Reflection
object x = GetSomeCLRObject();
Type xt = x.GetType();
MemberInfo DoSomethingMethod = xt.GetMethod("DoSomething");
DoSomethingMethod.Invoke(x, null);
PropertyInfo SomeMemberProperty = xt.GetProperty("SomeMember");
SomeMemberProperty.SetValue(x, 2);

我不了解你,但我喜欢前者。 =)

在这两种情况下,我都没有得到编译时检查,没有 Intellisense,没有 IDE 支持 - 但前一种情况比后者更具表现力。

【讨论】:

  • 哇,太棒了,我听说过很多动态语言功能,但完全不知道它是如何工作的。我经常将反射用于类库的东西,所以这很棒。实际上,我已经为 Object 编写了一些封装反射的扩展方法......现在它们将是多余的:-(
  • 更好的是,当您看到相同的语法可以针对在 DLR 上运行的某些东西——比如 Python 或 Javascript 方法——甚至是 COM 对象时......我认为这真的很棒。 =)
【解决方案3】:

动态调度只是反射的一种可能用途。有很多很好的理由来询问一个类的结构,获取有关该结构的信息并以某种形式可视化或以某种方式对其进行操作,而无需动态访问成员。反思在这里停留。 :)

如果您想要动态关键字的示例,the man himself 中的here is a video from PDC 正在谈论它(以及其他与 C# 4.0 相关的内容)。

【讨论】:

  • 是的,使用 C# 的 REPL 非常棒。
猜你喜欢
  • 2010-10-22
  • 2013-11-02
  • 1970-01-01
  • 2014-02-19
  • 2015-03-22
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多