Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在.net运行时向对象添加属性?_C#_.net - Fatal编程技术网

C# 如何在.net运行时向对象添加属性?

C# 如何在.net运行时向对象添加属性?,c#,.net,C#,.net,我正在使用第三方库来做一些工作。我将一个对象传递给lib,它将对对象的每个属性执行一些操作。它使用反射枚举属性。这就是它的实现方式,我不能改变它 我不知道lib在编译时应该处理哪些属性和多少属性。此信息仅在运行时可用。因此,我无法在源代码中创建类声明 似乎.net4的动态功能对我没有帮助,因为lib使用的是反射,而不是动态 实际上,我在这里只能看到两种选择: 创建一个巨大的类定义,如下所示: class Data { public object P1 {get; set;} pu

我正在使用第三方库来做一些工作。我将一个对象传递给lib,它将对对象的每个属性执行一些操作。它使用反射枚举属性。这就是它的实现方式,我不能改变它

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

似乎.net4的
动态
功能对我没有帮助,因为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:

    您能提供更多关于您正在使用的库的详细信息吗?