是否有一种方法可以创建一个支持接口的DynamicObject

本文关键字:一个 支持 DynamicObject 创建 接口 一种 方法 是否 | 更新日期: 2023-09-27 18:02:28

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

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

这可能吗?

谢谢

是否有一种方法可以创建一个支持接口的DynamicObject

ImpromptuInterface正是这样做的,它与任何iddynamicmetaobjectprovider包括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中,这并不总是直截了当的。

有了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的代理,混合和鸭子输入

相关文章: