Здравствуйте, Sorantis, Вы писали: S>Кто нибудь применял данную методику? Если да то в каких целях? В каких задачах он используется? S>Заранее спасибо Бывают ситуации, когда в момент написания программы для некоторых типов возможно описать только интерфейсы (или даже обобщенные интерфейсы, используя generics). Поведение, то есть логику методов, возможно будет определить лишь на этапе исполнения, например, на основе информации, считанной из базы данных. В этом случае мы пишем статический высокоуровневый код, оперирующий с объектами через интерфейсы ("честно", без использования reflection). Во время исполнения программы с помощью Reflection.Emit динамически определяются классы, реализующие имеющиеся интерфейсы, создаются их экземпляры (например, с помощью класса System.Activator), которые и передаются этому высокоуровневому коду. Более подробно данная методика описана, например, в этой статье. Ключевой момент в этой методике: формирование правильного CIL (Common Intermediate Language, или, как его еще называют — IL, MSIL). Как в нем разобраться? Большую помощь может оказать прочтение спецификации: Ecma-335, Partition III. Также полезно взять код на языке высокого уровня, например, C# или Nemerle (превед немерлистам! ), скомпилировать его и изучить CIL-код получившейся сборки с помощью Reflector'а или ildasm. Последний должен ставиться вместе с .NET SDK или Visual Studio .NET, например, на моем компьютере он находится по такому пути:
Идея очень проста: у каждого метода существует свой стек вычислений (evaluation stack, не путать со стеком вызовов методов!). Он устроен наподобие стека у советских программируемых калькуляторов: есть инструкции, которые кладут операнды на вершину стека, и есть инструкции, которые снимают один или несколько операндов оттуда, заменяя их результатом вычисления соответствующей операции. В .NET 2.0 появилась возможность создавать временные динамические методы без создания динамической сборки с помощью класса DynamicMethod. Читайте раздел MSDN, посвященный Reflection.Emit. Успехов! |