0

我听说使用反射创建实例的最佳做法是使用动态类型变量。这意味着当我们使用Activator.CreateInstance()方法(返回对象)时,我们将其分配给动态类型而不是对象类型:

dynamic dog = Activator.CreateInstance("Zoo.Dog");
dog.Bark();

代替:

object dog = Activator.CreateInstance("Zoo.Dog");
Dog realDog = (Dog)dog;
realDog.Bark();

除了缺少强制转换之外,还有什么好的理由使用动态?

4

1 回答 1

0

如果您有权访问要从中创建实例的类型,则无需使用dynamic类型。dynamic如果您无法(以静态方式)访问该类型,例如在动态加载程序集时,您可能需要使用该类型。如果您使用动态类型而不是已知类型,则您调用的每个类型都将在后台使用反射。此外,您不会使用dynamic类型进行智能感知。

您可以使用该类中的通用方法CreateInstance<T>Activator创建您的实例。

Dog dog = Activator.CreateInstance<Dog>();
dog.Bark();

dynamic关键字使与动态语言(例如 IronPython、IronRuby)(动态语言运行时 DLR)或 COM 互操作 API 的交互变得更容易,但不建议(也不需要)将其与已知类型一起使用。

于 2013-09-15T22:51:21.090 回答