Есть ли способ создать DynamicObject, который поддерживает интерфейс? - PullRequest
11 голосов
/ 15 июля 2011

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

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

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

Спасибо

Ответы [ 3 ]

8 голосов
/ 18 июля 2011

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, что не всегда просто.

3 голосов
/ 15 июля 2011

С Глиной вы можете.

Пример:

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;

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

1 голос
/ 15 июля 2011
...