13

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

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

这可能吗?

谢谢

4

3 回答 3

11

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 的对象,而是使用它自己的幼稚后期绑定,这给它带来了严重的性能成本。Clay 确实使用了 dlr,但您必须坚持使用 Clay 对象,这些对象旨在将所有行为注入 ClayObject 中,这并不总是那么简单。

于 2011-07-18T13:08:29.370 回答
3

使用粘土,您可以。

一个例子:

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;

本文展示了实现这一目标的更多方法。

于 2011-07-15T19:51:56.213 回答
1

查看LinFu 的代理、mixins 和鸭子类型

于 2011-07-15T19:56:29.693 回答