有动态,尴尬的反思不再?

时间:2009-05-03 03:36:09

标签: c# dynamic reflection runtime

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

这是否意味着我们不再需要尴尬的反思?如果可以的话,你能举例说明吗?

3 个答案:

答案 0 :(得分:6)

我们仍然会有反射 - 对常规CLR对象使用'dynamic'会调用基于反射的调度程序。

所以 - 我们仍然会有反思,但这样做会更容易。

以下是一个例子:

// 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支持 - 但前一种情况比后者更具表现力。

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

动态将通过名称已知的方法解决问题很长,其中该名称已知并在编译时修复 - 但当然,如果您控制类型,这些方法也可以表示为接口。

有些情况dynamic根本没有帮助:

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

我在dynamic看到的最大用途是:

  • COM interop(显然)
  • 通用运营商支持
  • 鸭子打字,没有通用界面
  • DLR互操作(见评论)

但它肯定无法解决每一个反思。