Пожалуйста, помогите мне понять, являются ли плюсы и минусы, с которыми я столкнулся, разумными или нет?
Я обеспокоен вашими плюсами и минусами в том, что некоторые из них не учитывают различий между отражением и динамикой. Эта динамическая типизация создает ошибки, которые не обнаруживаются до тех пор, пока время выполнения не станет верным для любой системы динамической типизации. Код отражения также может иметь ошибку, как и код, использующий динамический тип.
Вместо того чтобы думать об этом с точки зрения плюсов и минусов, думайте об этом в более нейтральных терминах. Я хотел бы задать вопрос: «Каковы различия между использованием Reflection и использованием динамического типа?»
Первое: с Reflection вы получаете точно то, что вы просили. С помощью dynamic вы получаете того, что сделал бы компилятор C #, если бы ему дали информацию о типе во время компиляции . Это потенциально две совершенно разные вещи. Если у вас есть MethodInfo для конкретного метода, и вы вызываете этот метод с определенным аргументом, то , это метод, который вызывается , точка. Если вы используете «динамический», то вы просите DLR определить во время выполнения, что думает компилятор C #, какой метод является правильным для вызова. Компилятор C # может выбрать метод, отличный от того, который вы на самом деле хотели.
Второе: с помощью Reflection вы можете (если вашему коду предоставлен достаточно высокий уровень доверия) делать личные размышления. Вы можете вызывать приватные методы, читать приватные поля и так далее. Является ли это хорошей идеей, я не знаю. Это, конечно, кажется мне опасным и глупым, но я не знаю, какое у вас заявление. С динамическим вы получаете поведение, которое вы получите от компилятора C #; закрытые методы и поля не видны.
В-третьих: с Reflection код, который вы пишете, выглядит как механизм . Похоже, что вы загружаете источник метаданных, извлекаете некоторые типы, извлекаете некоторую информацию о методах и вызываете методы для объектов-получателей через информацию о методе. Каждый шаг пути выглядит как работа механизма . С динамикой каждый шаг на пути выглядит как бизнес-логика . Вы вызываете метод для получателя так же, как в любом другом коде. Что важно? В некотором коде механизм на самом деле самая важная вещь. В некотором коде бизнес-логика, которую реализует механизм, является самой важной вещью. Выберите технику, которая подчеркивает правильный уровень абстракции.
Четвертый: затраты на производительность разные. С отражением вы не получаете никакого кэшированного поведения, что означает, что операции, как правило, медленнее, но нет затрат памяти для обслуживания кэша, и каждая операция примерно одинакова. С DLR первая операция действительно очень медленная, поскольку она выполняет огромное количество анализа, но анализ кэшируется и используется повторно. Это потребляет память в обмен на увеличение скорости при последующих вызовах в некоторых сценариях. Какой правильный баланс скорости и использования памяти для вашего приложения, я не знаю.