Есть ли способ создать DynamicObject, поддерживающий интерфейс?

Можно ли определить класс, который происходит из DynamicObject, и поддерживает интерфейс (ICanDoManyThings) без необходимости реализации каждого метода в интерфейсе?

Я пытаюсь создать динамический прокси-объект и хочу, чтобы вызовы метода в этом классе обрабатывались реализацией MyProxyClass.TryInvokeMember, которые могут или не могут передать их обернутому объекту.

Возможно ли это?

Спасибо

Ответ 1

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);

Linfu фактически не использует объекты на основе DLR и скорее использует собственную наивную позднюю привязку, которая дает ему СЕРЬЕЗНУЮ стоимость исполнения. Глина использует dlr, но вы должны придерживаться объектов Clay, которые предназначены для того, чтобы вы вводили все поведение в объект ClayObject, который не всегда прост.

Ответ 2

С 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;

В этой статье показано еще несколько способов достижения этой цели.