所以ImpromtuInterface
使用 DLR,基本上当您调用 ActLike() 时,它会为该接口发出并缓存一个代理,并将其包装在您的对象周围。
public class Proxy:IMyInterface {
dynamic target;
public int Foo(){
return (int)target.Foo()
}
}
由于它是一个动态调用,因此如果它是和 IDynamicMetaObjectProvider 最流行的自定义存在,那么您实际上并没有目标上的方法System.Dynamic.DynamicObject
。
public class RoughDynamicAdapter:DynamicObject{
public override bool TryInvokeMember(InvokeMemberBinder binder,
Object[] args,
out Object result){
if(binder.Name == "Foo"){
result = /* do your own logic */
return true;
}
result = null;
return false;
}
}
但这需要做很多工作,因为您必须像处理已修改的调用一样处理未修改的调用。
有几个 prefabDynamicObject
我ImpromptuInterface
已经移到了一个单独的库Dynamitey。
特别是,BaseForwarder
听起来像您想要的,因为不是处理所有逻辑,而是将消息转发到目标对象已经作为基本功能实现。
public class DynamicAdapter:Dynamitey.DynamicObjects.BaseForwarder {
public DynamicAdapter(object target):base(target){
}
public override bool TryInvokeMember(InvokeMemberBinder binder,
Object[] args,
out Object result){
var newName = binder.Name;
if(newName == "Foo"){
result = Dynamic.InvokeMember(CallTarget, "Bar", args)
return true;
}
//else pass them method on as it was called
return base.TryInvokeMember(binder, args, out result)
}
}
然后使用它将是new DynamicAdapter(myObject).ActLike<IMyInterface>()