2011-07-15 49 views
10

我可以定义一个从DynamicObject派生并支持接口(ICanDoManyThings)而不必在接口中实现每个方法的类?有没有办法创建一个支持接口的DynamicObject?

我想做一个动态代理对象,并希望该类的方法调用由MyProxyClass.TryInvokeMember的实现来处理,它可能会或可能不会将它们传递给包装对象。

这可能吗?

感谢

回答

7

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中,而这并不总是直截了当的。

+0

如果我写我自己的expando并调用'ActLike',这个工作吗?就像'dynamic tNew = new ExpandoObject(); tNew.Prop1 =“测试”;'......等等......和'Impromptu.ActLike (tNew);'? – nawfal

+1

是的,它适用于任何'IDynamicMetaObjectProvider',因为它使用C#'dynamic'关键字API。 – jbtule

3

随着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显示几个方式来实现这一目标。

+0

最好从nuget安装ClaySharp而不是Clay,因为后者与Castle.Core项目存在依赖关系(不幸的是,最近的Castle.Core也不能使用),而前者没有依赖关系问题。 – nawfal

+0

虽然Clay提供了很大的灵活性,但我喜欢Impromptu的方法。非常简单。另一种情况是,Clay在使用方法的接口方面表现不佳。 – nawfal

相关问题