我可以定義一個從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