繁体   English   中英

NET中如何在运行时向对象添加属性?

[英]How to add properties to the object at run-time in .net?

我正在使用3rd party lib做一些工作。 我将一个对象传递给lib,它对对象的每个属性执行一些操作。 它使用反射枚举属性。 这是它的实现方式,我无法更改。

我不知道在编译时lib应该处理哪些属性以及多少属性。 此信息仅在运行时可用。 因此,我无法在源代码中创建类声明。

.net4的dynamic功能似乎无济于事,因为lib使用反射而不是动态的。

实际上,我在这里只能看到两个选项:

  1. 创建一个巨大的类定义,如下所示:

     class Data { public object P1 {get; set;} public object P2 {get; set;} .... public object PN {get; set;} // N should be at least 10.000 } 
  2. 在运行时生成类定义,并使用CSharpCodeProvider进行编译。

您能建议我其他选择吗?

可悲的是,我不能用另一个库代替这个库。

使用第一种方法将导致高内存消耗。 我会选择使用TypeBuilder类在运行时创建新类型。

您要寻找的东西被称为“ 物业袋” 您可以使用ICustomTypeDescriptor公开其他元数据(假设您的库支持它)来实现类似的功能。

如果您的使用库直接使用了Reflection(而不利用类型描述符等设计器功能),那么最好的选择可能是动态生成具有其他属性的代理包装器。 Castle DynamicProxy是执行此操作的一种好方法。


编辑:

实际上,我不确定Castle是否支持将新属性添加到代理对象。 您可能会直接通过TypeBuilder使用IL Emit陷入困境。 这是不平凡的,因为您需要充分了解IL Emit才能生成属性访问器,并且还有一些学习曲线。 就是说,这是有趣而有趣的东西,如果有时间,值得付出努力。

我猜这是关于常规GUI元素的,例如Grid或PropertyGrid。

然后,我将从反映网格的接受类实例作为参数的方法开始,如果可能的话,用我自己的值填充内部Dictionary或Dictionary。

如果这是不可能的,请尝试使用System.CodeDom代替Emit: http : //blogs.msdn.com/b/lukeh/archive/2007/07/11/c-3-0-and-codedom.aspx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM