2013-09-15 3 views
0

Я слышал, что наилучшей практикой создания экземпляра с использованием отражения является использование переменной динамического типа. Что это означает, что, когда мы используем метод Activator.CreateInstance() (что объект возвращается) мы относим его в динамический тип вместо типа объекта:с использованием динамического с отражением

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

Вместо:

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

Есть ли хороший причина использовать динамику, отличную от отсутствия литья?

+2

Пожалуйста, добавьте тег языка. – arshajii

+0

'dynamic' предназначен для взаимодействия со скриптовыми языками или для использования с другими видами объектов, которые не имеют общего статического типа. (ASP.NET MVC 'ViewBag',' ExpandoObject' вообще и т. Д.) Кроме того, «отсутствие каста» на самом деле не совсем точно описывает, как это работает - динамические вызовы/выражения динамически обрабатываются довольно иначе, чем статические. – millimoose

+0

Я знаю, что такое динамика. Мой вопрос в том, почему пример, показанный выше, считается наилучшей практикой при создании экземпляра с использованием рефлекса. – RiskX

ответ

0

Если у вас есть доступ к типу, из которого вы создаете свой экземпляр, тогда нет необходимости использовать тип dynamic. Возможно, вам понадобится использовать тип dynamic, если у вас нет доступа (по статическому) к типу, например, при динамической загрузке сборки. Если вы используете динамический тип вместо известного типа, каждый тип вы вызываете члена вашего экземпляра, который будет использовать отражение под капотом. Кроме того, у вас не будет intellisense с использованием типов dynamic.

Для создания вашего примера можно использовать общий метод CreateInstance<T> из класса Activator.

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

dynamic ключевое слово облегчает взаимодействие с динамическими языками (IronPython, IronRuby, например) (Dynamic Language Runtime DLR) или API-интерфейсы COM Interop, но это не рекомендуется (и не нужно), чтобы использовать его с известными видами.

Смежные вопросы