C# 4.0 动态特性

6
动态类的存在意义是什么?你可以调用可能存在或不存在的方法,这有什么意义?
6个回答

10

主要是让 C# 4 可以更好地与使用 Python 等语言提供的 DLR 对象进行互操作。它还可以更轻松地与典型的 COM 对象进行互操作,而无需创建互操作程序集。


4
重点在于你通常可以确信该方法将存在(或通过动态处理 - 例如将“按作者查找”方法转换为适当的SQL查询的“书籍存储库”类中)但你不知道静态类型 - 或者接口类型相对较弱(例如Office COM API)。
我不认为动态类型在C#中经常有用 - 但当它派上用场时,我认为它会非常有用。

3

一个原因是为了更容易地使用后期绑定与COM进行交互。因此,您不再需要使用Interop程序集。

如果您需要调用不同版本的COM服务器,则这非常好。例如,当您需要使应用程序与不同版本的Office一起工作时。


+1:当我遇到KB 2517589中描述的问题时,我发现了这一点的重要性。我仍然使用自动完成的相关程序集,但是在编译时,我用dynamic替换了相关类名。 - Brian

1

我肯定不会在非交互操作场景下使用它。在处理程序集或动态语言编写的代码时,它简化了设计时间体验。在这些情况下,您必须对动态类型进行假设。如果您的假设失败,无论如何都会在运行时引发异常。

把它看作是Invoke或反射的速记。


1

另一个问题可能在编写应该与某些汇编版本一起工作的代码时出现。比如一个插件,其中没有定义任何程序集绑定。现在,需要为多个主机程序集版本编译相同的源代码。

在这种情况下,“鸭子类型”这样的特性将是一个很好的解决方案。


0

我的看法是:非常有用的动态场景是隐式接口。以EndianBinaryReader为例,它可以代替BinaryReader,但这两个类没有共同的适当接口。是的,你也可以创建这样的接口并包装这些类,但这不会扩展(如果你因某种原因获得了第三个具有这样的接口的类,你也必须将其包装)。隐式接口(鸭子类型)是动态语言中有用的特性,在C#中使用dynamic也可以实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接