从"对象表示"创建动态代理类

时间:2015-09-24 12:33:18

标签: c# .net entity-framework reflection types

是否有可能创建一个实际类的对象模型表示,可以再次转换为真实类,它适合原点的签名,以便将其用作某种动态代理?

目前,我的应用程序中有一个插件API /接口,看起来像这样(简化虚拟):

public interface IPlugin {
    void Initialize();
    void SendData(DataObject data);
}

DataObject可能如下所示:

public class DataObject {
    public string Value1 { get; set; }
    public string Value2 { get; set; }
}

使用此界面,我可以将任何类型的数据发送到插件,但它有一些缺点:

  • 它不是真正可扩展的
  • 插件需要手动解析/解释数据
  • 我可以向插件发送完整的乱码
  • 我需要一个额外的规范来指定数据的外观。

我想要的是一个可以像这样扩展的插件界面:

public interface IPlugin :
    ICanReceive<ArbitaryClass1>,
    ICanReceive<ArbitaryClass2>
{
    // implements void Receive(ArbitaryClass1 value);
    // implements void Receive(ArbtiaryClass2 value);
}

该插件将提供类本身,而无需主应用程序来了解这些类型。为了完成这项工作,我考虑了以下几点:

  • 反映插件实现的接口的通用参数
  • 将类型映射到&#34;对象模型&#34;,它们可能如下所示:

实施例

interface IType {
    + TypeKind (e.g. primitive, structured, reference, collection)
}

interface IStructuredType : IType {
    + collection of <IPropertyType>
    + StructuredTypeKind (e.g. complex, entity)
}
  • 将对象模型保留在数据库中以进行值编辑
  • 在将数据发送到插件后,使用最初从类型中反映的相同签名从对象模型中创建代理类,从而匹配ICanReceive<'T>的方法

我的问题是:这样的事情怎么可能起作用(特别是动态代理的东西)?怎么可以这样做? Reflection.Emit的CodeDOM ?已经有一些标准来表示对象模型,例如 EDM (用于 EntityFramework OData )和AFAIK,实体框架在从DbSet<'T>访问实体时已经为延迟加载等内容返回动态代理对象,因此必须有办法执行此操作。 :)

0 个答案:

没有答案