Выяснить, является ли тип инстанцируемым

#c# #reflection #interface #types #instantiation

#c# #отражение #интерфейс #типы #Создание экземпляра

Вопрос:

Как я могу в C # узнать, Type можно ли создать экземпляр a? Я пытаюсь избежать активатора.Исключение CreateInstance.

Мой текущий метод — type.IsClass amp;amp; !type.IsInterface , но я беспокоюсь, что это может привести к сбою в абстрактных классах и т.д. Я также рассматривал возможность проверки type.TypeInitializer == null , но я не уверен, что это тоже надежно.

Какой самый простой / эффективный способ узнать, является ли Type инстанцируемым?

Комментарии:

1. Чтобы он был «безопасным», не должен ли он также проверить IsPublic и аналогичные свойства объекта ConstructorInfo, возвращаемого getConstructor(). Я не знаю. Я спрашиваю..

Ответ №1:

Рассмотрим isAbstract . Он будет обрабатывать как абстрактный, так и статический класс. Вы также можете захотеть проверить IsInterface

Комментарии:

1. Похоже, что isAbstract также возвращает true для интерфейса: msdn.microsoft.com/en-us/library /…

2. Не забудьте также о IsGenericTypeDefinition! Не удается создать экземпляр универсального типа с несвязанными параметрами.

Ответ №2:

Есть много других ловушек. У него может быть конструктор, который является частным или защищенным. Или у него может не быть конструктора по умолчанию, только конструкторы, которые принимают определенные типы аргументов. Если вам нужно беспокоиться об этом, то вы наверняка используете Activator.Создайте функцию CreateInstance(), когда ее не следует использовать. Простое произвольное построение объектов может привести только к хаосу, вы понятия не имеете, какие побочные эффекты они могут иметь. Избегайте класса «FormatDisk».

Исключение — ваш друг, оно говорит вам, что ваши предположения были неверными. Никогда намеренно не останавливайте .NET framework не был полезен.

Комментарии:

1. Я создаю экземпляры реализаций интерфейса, поэтому я кое-что о них знаю. Тем не менее, я ценю предупреждение.

2. Отлично, тогда вам не придется беспокоиться об исключениях или случайном создании абстрактного класса. Простое известное имя выполняет свою работу.

3. Как бы я проверил наличие конструктора по умолчанию?

4. Кроме того, исключения хороши, но также и изящная обработка их. Я бы предпочел проверить «if (не null)», чем «try-catch(null)».

5. Принято для примеров «частный конструктор» и «конструктор по умолчанию».