Я пытаюсь создать прокси-класс динамически. Я знаю, что для этого есть очень хорошие рамки, но это чисто любимый проект как учебное упражнение, поэтому я хотел бы сделать это сам.
Если, например, у меня есть следующий класс, реализующий интерфейс:
interface IMyInterface
{
void MyProcedure();
}
class MyClass : IMyInterface
{
void MyProcedure()
{
Console.WriteLine("Hello World");
}
}
Чтобы перехватить методы для этого класса для их регистрации, я создаю еще один класс (моя версия прокси-класса), который реализует один и тот же интерфейс, но содержит ссылку на "настоящий" класс. Этот класс выполняет действие (например, протоколирование), а затем вызывает тот же метод в реальном классе.
Например:
class ProxyClass : IMyInterface
{
private IMyInterface RealClass { get; set; }
void MyProcedure()
{
// Log the call
Console.WriteLine("Logging..");
// Call the 'real' method
RealClass.MyProcedure();
}
}
Затем вызывающий абонент вызывает все методы в прокси-классе (я использую базовый home- brew контейнер IoC, чтобы ввести класс прокси вместо реального класса). Я использую этот метод, потому что я хотел бы иметь возможность поменять RealClass
во время выполнения на другой класс, реализующий тот же интерфейс.
Есть ли способ создать ProxyClass
во время выполнения и заполнить его свойство RealClass
, чтобы он мог использоваться как прокси для реального класса? Есть ли простой способ сделать это или мне нужно использовать что-то вроде Reflection.Emit
и сгенерировать MSIL?