不再有动态的、尴尬的反思了吗?
-
03-07-2019 - |
题
C#4.0介绍 dynamic
关键字,它将在运行时查找。
这是否意味着我们不再需要尴尬的反思?如果是的话,你能举个例子吗?
解决方案
我们仍然会有反射 - 对常规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支持 - 但前一种情况比后者更具表现力。
其他提示
动态调度只是Reflection的一种可能用途。有一个很好的理由来询问一个类的结构,获取有关该结构的信息并以某种形式可视化或以某种方式对其进行操作而无需动态访问成员。反思就在这里。 :)
如果您需要动态关键字的示例,请这里是来自PDC的视频 男方本人谈论它(和其他东西C#4.0)相关的)。
动态将大大有助于解决仅通过名称已知的方法的问题,其中该名称是已知的并在编译时固定 - 但当然,如果您控制类型,此类方法也可以表示为接口。
有些情况下 dynamic
根本没有帮助:
- 其中方法名称在编译时未知(即它是从配置/用户输入加载的)
- 对象创建
- 也许一些泛型场景
我看到的最大用途 dynamic
是:
- COM 互操作(显然)
- 通用操作员支持
- 没有通用接口的鸭子打字
- DLR 互操作(参见评论)
但它绝对不能解决所有反射问题。
不隶属于 StackOverflow