有没有办法创建支持接口的DynamicObject?

时间:2011-07-15 19:50:02

标签: c# c#-4.0 dynamic-proxy dynamicobject

我可以定义一个派生自DynamicObject并支持接口(ICanDoManyThings)的类,而无需在接口中实现每个方法吗?

我正在尝试创建一个动态代理对象,并希望通过MyProxyClass.TryInvokeMember的实现来处理此类上的方法调用,这可能会也可能不会将它们传递给包装对象。

这可能吗?

由于

3 个答案:

答案 0 :(得分:8)

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的对象,而是使用它自己的天真后期绑定,这会给它带来 SERIOUS 性能成本。 Clay确实使用了dlr,但你必须坚持使用Clay对象,这些对象是为了将所有行为注入到ClayObject中而不是总是直截了当的。

答案 1 :(得分: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显示了更多实现这一目标的方法。

答案 2 :(得分:1)