我想构建一个动态代理对象来为对象添加某些功能。
基本上我想接收一个对象,用一个看起来与我得到的原始对象相同的对象包装它,并拦截所有调用。
class Wrapper : DynamicProxy// dynamic proxy is not a reall class, but i guess something like this exists...
{
public static T Wrap(T obj)
{
return (T) new Wrapper(obj);
}
public override object InterceptCall(MethodInfo info, object[] args)
{
// do stuff
}
}
澄清一下,我想做一些类似于 WCF channel 工厂的事情......
我正在添加赏金,因为我需要一个很好的方法来代理类(而不是接口(interface))和处理非虚拟方法(就像我在“new”关键字下继承并添加了一个方法一样)。 我确信这一切都是很有可能的,因为 .Net 做到了。
最佳答案
您可以使用 DynamicObject 的组合来做到这一点和 ImpromptuInterface但是您必须有一个接口(interface)来实现您要代理的功能和属性。
public interface IDoStuff
{
void Foo();
}
public class Wrapper<T> : DynamicObject
{
private readonly T _wrappedObject;
public static T1 Wrap<T1>(T obj) where T1 : class
{
if (!typeof(T1).IsInterface)
throw new ArgumentException("T1 must be an Interface");
return new Wrapper<T>(obj).ActLike<T1>();
}
//you can make the contructor private so you are forced to use the Wrap method.
private Wrapper(T obj)
{
_wrappedObject = obj;
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
try
{
//do stuff here
//call _wrappedObject object
result = _wrappedObject.GetType().GetMethod(binder.Name).Invoke(_wrappedObject, args);
return true;
}
catch
{
result = null;
return false;
}
}
}
您当然可以选择失去类型安全并使用 DynamicObject
,就像我展示的那样,然后放弃 duck-casting。
我制作了这个对象代理的透明可扩展版本,并将其开源 here .
关于c# - 如何在C#中制作一个简单的动态代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8387004/