C# 如何在.net运行时向对象添加属性?
我正在使用第三方库来做一些工作。我将一个对象传递给lib,它将对对象的每个属性执行一些操作。它使用反射枚举属性。这就是它的实现方式,我不能改变它 我不知道lib在编译时应该处理哪些属性和多少属性。此信息仅在运行时可用。因此,我无法在源代码中创建类声明 似乎.net4的C# 如何在.net运行时向对象添加属性?,c#,.net,C#,.net,我正在使用第三方库来做一些工作。我将一个对象传递给lib,它将对对象的每个属性执行一些操作。它使用反射枚举属性。这就是它的实现方式,我不能改变它 我不知道lib在编译时应该处理哪些属性和多少属性。此信息仅在运行时可用。因此,我无法在源代码中创建类声明 似乎.net4的动态功能对我没有帮助,因为lib使用的是反射,而不是动态 实际上,我在这里只能看到两种选择: 创建一个巨大的类定义,如下所示: class Data { public object P1 {get; set;} pu
动态
功能对我没有帮助,因为lib使用的是反射,而不是动态
实际上,我在这里只能看到两种选择:
class Data
{
public object P1 {get; set;}
public object P2 {get; set;}
....
public object PN {get; set;} // N should be at least 10.000
}
CSharpCodeProvider
编译类定义并使用它遗憾的是,我不能用另一个库替换这个库。使用第一种方法会导致内存消耗过高。我会选择使用类在运行时创建新类型。您要查找的是一个名为。通过使用来公开额外的元数据(假设您的库支持),您可以实现类似的功能 若您的消费库直接使用反射(而不是利用类型描述符之类的设计器功能),那个么最好的选择可能是动态生成具有附加属性的代理包装器。这是一个很好的方法
编辑:
实际上,我不确定Castle是否支持向代理对象添加新属性。您可能无法通过直接使用IL Emit。这是非常重要的,因为您需要充分了解IL Emit以生成属性访问器,并且有一个学习曲线。也就是说,这是一个有趣有趣的东西,如果你有时间的话,值得付出努力。我想这是关于常规GUI元素,比如Grid或PropertyGrid 然后,我将从接受类实例作为参数的反射网格方法开始,如果可能的话,用我自己的值填充内部字典或字典 如果这是不可能的,请尝试使用System.CodeDom而不是Emit:
您能提供更多关于您正在使用的库的详细信息吗?