【发布时间】:2013-03-21 23:08:18
【问题描述】:
我正在尝试动态创建代理类。我知道有一些非常好的框架可以做到这一点,但这纯粹是一个作为学习练习的宠物项目,所以我想自己做。
例如,如果我有以下类实现一个接口:
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();
}
}
然后调用者调用代理类上的所有方法(我使用一个基本的自制 IoC 容器来注入代理类来代替真实类)。我使用这种方法是因为我希望能够在运行时将RealClass 换成另一个实现相同接口的类。
有没有办法在运行时创建ProxyClass 并填充其RealClass 属性,以便它可以用作真实类的代理?有没有一种简单的方法可以做到这一点,还是我需要使用 Reflection.Emit 之类的东西并生成 MSIL?
【问题讨论】:
-
动态生成是什么意思?你的意思是你有一个 Type 对象并且想要实例化这个类型的对象吗?
-
是的。我想在运行时从 IMyInterface 创建一个 ProxyClass 的实例,用对真实类的引用填充它的“RealClass”属性,这样它就可以用来拦截对真实类的所有调用。我将编辑问题以澄清谢谢。
-
查看 Castle 的 DynamicProxy castleproject.org/projects/dynamicproxy
标签: c# .net reflection proxy