我可以定义一个从DynamicObject派生并支持接口(ICanDoManyThings)而不必在接口中实现每个方法的类?有没有办法创建一个支持接口的DynamicObject?
我想做一个动态代理对象,并希望该类的方法调用由MyProxyClass.TryInvokeMember的实现来处理,它可能会或可能不会将它们传递给包装对象。
这可能吗?
感谢
我可以定义一个从DynamicObject派生并支持接口(ICanDoManyThings)而不必在接口中实现每个方法的类?有没有办法创建一个支持接口的DynamicObject?
我想做一个动态代理对象,并希望该类的方法调用由MyProxyClass.TryInvokeMember的实现来处理,它可能会或可能不会将它们传递给包装对象。
这可能吗?
感谢
ImpromptuInterface完全是这样,它可以与任何IDynamicMetaObjectProvider(包括DynamicObject子类和ExpandoObject)一起使用。
using ImpromptuInterface;
using ImpromptuInterface.Dynamic;
public interface IMyInterface{
string Prop1 { get; }
long Prop2 { get; }
Guid Prop3 { get; }
bool Meth1(int x);
}
...
//Dynamic Expando object
dynamic tNew = Build<ExpandoObject>.NewObject(
Prop1: "Test",
Prop2: 42L,
Prop3: Guid.NewGuid(),
Meth1: Return<bool>.Arguments<int>(it => it > 5)
);
IMyInterface tActsLike = Impromptu.ActLike<IMyInterface>(tNew);
李林甫实际上不会使用基于DLR对象和而使用它自己的天真后期绑定这使得它严重性能成本。 Clay确实使用了dlr,但是你必须坚持使用为你设计的Clay对象来将所有的行为注入到ClayObject中,而这并不总是直截了当的。
随着Clay,就可以了。
一个例子:
public interface IMyInterface
{
string Prop1 { get; }
long Prop2 { get; }
Guid Prop3 { get; }
Func<int, bool> Meth { get; }
}
//usage:
dynamic factory = new ClayFactory();
var iDynamic = factory.MyInterface
(
Prop1: "Test",
Prop2: 42L,
Prop3: Guid.NewGuid(),
Meth: new Func<int, bool>(i => i > 5)
);
IMyInterface iStatic = iDynamic;
This article显示几个方式来实现这一目标。
linfu使用它自己的发明来实现DLR之前的DynamicObject。上行是它与.net 3.5一起工作,但它的速度可能会很慢。 – jbtule
如果我写我自己的expando并调用'ActLike',这个工作吗?就像'dynamic tNew = new ExpandoObject(); tNew.Prop1 =“测试”;'......等等......和'Impromptu.ActLike(tNew);'? –
nawfal
是的,它适用于任何'IDynamicMetaObjectProvider',因为它使用C#'dynamic'关键字API。 – jbtule