АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Создание объекта по его типу

Читайте также:
  1. I ступень – объектив- центрическая система из 4-10 линз для непосредственного рассмотрения объекта и формирования промежуточного изображения, расположенного перед окуляром.
  2. АВАРИИ НА РАДИАЦИОННО-ОПАСНЫХ ОБЪЕКТАХ
  3. АВАРИИ НА ХИМИЧЕСКИ ОПАСНЫХ ОБЪЕКТАХ
  4. Анализ объекта проектирования. Описание компонента РЭС
  5. Анализ производственно-хозяйственной деятельности конкретного объекта исследования.
  6. В нашем доме пожар? Создание театра медиа в период информационных войн
  7. Внешняя политика СССР в 1945-1885гг: изменения на международной арене, создание мировой социалистической системы, этапы холодной войны.
  8. Вопрос 7. Структура денежной массы. Создание денег банковской системой. Депозитный и денежный мультипликатор.
  9. Выбор объекта воздействия
  10. Глава 1 Создание специальных служб Финляндии 1914-1919гг.
  11. Глава 3. Тенденции совершенствования и развития объекта исследования
  12. Задание 1. Создание запроса на выборку из двух таблиц с помощью мастера.

При создании объекта вызывается его конструктор. Если вас устраивает вариант создания объекта с вызовом конструктора без аргументов (конструктора по умолчанию), то задача решается очень просто. Например, вот так:


 

class Class1{ int n = 5; static void Main() { string className = "App1.Class1"; Type type = Type.GetType(className); Object data = Activator.CreateInstance(type); Console.WriteLine(Trace1.ObjectFields("data", data)); Console.ReadLine(); }}

Для подобного рода вещей предназначен специальный класс Activator. У него есть набор статических методов CreateInstance, с помощью которых можно создавать объекты, не только имея объект Type, но также по имени сборки и имени класса, или по файлу сборки и имени класса. Среди методов CreateInstance есть и такие, которые позволяют использовать конструкторы с аргументами и задавать пользовательские атрибуты создаваемого класса.

ПРИМЕЧАНИЕ Наряду с классом Activator способностью создавать объекты по их типу обладают классы Assembly, AppDomain и некоторые другие. У них тоже есть методы CreateInstance, работа с которыми ведётся подобным образом.

 

Хочу обратить ваше внимание на то, как определялось, что тип, считанный из сборки, реализует необходимый интерфейс. В данном случае не было экземпляра объекта, к которому применялась бы операция as. Поэтому был использован метод IsAssignableFrom класса Type.

Говоря точнее, в большинстве случаев у нас есть возможность создать экземпляр объекта, а потом применить к нему as, но делать так не совсем рационально. Во-первых, создание объекта может быть недешёвым удовольствием, тем более что неизвестно, будем ли мы его использовать в дальнейшем, или он нам не подойдёт. Во-вторых, возможно, что объект всё равно не удастся создать, потому что тип может быть абстрактным классом или интерфейсом.

Класс Type имеет ещё один метод со схожей функциональностью – IsInstanceOfType. В отличие от IsAssignableFrom он принимает в качестве аргумента не объект Type, а экземпляр объекта. Метод IsInstanceOfType определяет, является ли тип объекта, переданного в аргументе, наследником типа, для которого этот метод вызван. Иначе можно это сформулировать вот так:

type.IsInstanceOfType(obj) = obj.GetType().IsAssignableFrom(type)

 


 

Если речь зашла о приведениях типов и о выяснении того, кто чей предок, то нельзя не коснуться операций is и as. Честно говоря, я начал немного путаться в этих функциях и операциях, и сделал себе такую табличку. Может, она и вам пригодится?


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.002 сек.)