2011-07-15 50 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

相關問題