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