DynamicObject から派生し、インターフェイス (ICanDoManyThings) をサポートするクラスを、インターフェイスに各メソッドを実装することなく定義できますか?
動的プロキシ オブジェクトを作成しようとしていますが、このクラスでのメソッド呼び出しを MyProxyClass.TryInvokeMember の実装によって処理する必要があります。これは、それらをラップされたオブジェクトに渡す場合と渡さない場合があります。
これは可能ですか?
ありがとう
DynamicObject から派生し、インターフェイス (ICanDoManyThings) をサポートするクラスを、インターフェイスに各メソッドを実装することなく定義できますか?
動的プロキシ オブジェクトを作成しようとしていますが、このクラスでのメソッド呼び出しを MyProxyClass.TryInvokeMember の実装によって処理する必要があります。これは、それらをラップされたオブジェクトに渡す場合と渡さない場合があります。
これは可能ですか?
ありがとう
ImpromptuInterfaceはまさにこれを行い、DynamicObject サブクラスと ExpandoObject を含む任意の IDynamicMetaObjectProvider で動作します。
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);
Linfu は実際には DLR ベースのオブジェクトを使用せず、独自のナイーブ レイト バインディングを使用するため、深刻なパフォーマンス コストが発生します。Clay は dlr を使用しますが、常に単純ではない ClayObject にすべての動作を注入するように設計された Clay オブジェクトに固執する必要があります。
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;
この記事では、これを実現する方法をいくつか紹介します。
LinFu のプロキシ、ミックスイン、ダック タイピングを確認してください。