C#4.0引入了dynamic
关键字,该关键字将在运行时查找。
这是否意味着我们不再需要尴尬的反思?如果可以的话,你能举例说明吗?
答案 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
看到的最大用途是:
但它肯定无法解决每一个反思。