【问题标题】:.NET Reflection Create Class Properties.NET 反射创建类属性
【发布时间】:2009-04-28 17:25:45
【问题描述】:

我对反射相当陌生,如果可能的话,我想知道如何创建一个类的实例,然后向该类添加属性,设置这些属性,然后再阅读它们。我没有任何代码,因为我什至不知道如何开始做这件事。 C# 或 VB 都可以。

谢谢

编辑:(详细说明)

我的系统有一个动态表单创建器。我的一位同事要求可以通过 Web 服务访问表单数据。我的想法是创建一个类(基于动态表单)向类添加属性(基于表单字段)设置这些属性(基于为这些字段输入的值)然后在 Web 服务中返回该类。

此外,Web 服务将能够设置类中的属性并最终将这些更改提交到数据库。

【问题讨论】:

  • 您确定不能只使用字典按名称动态存储值吗?
  • 同意 Stefan,根据您的问题,听起来您正在尝试在其他解决方案更合适的地方使用反射。你能详细说明一下吗?
  • 考虑到 Web 服务建立在已建立的合同之上以能够序列化和反序列化类,我想知道重点是什么?您首先动态创建一个类并实例化一个对象,只是为了通过 SOAP 对其进行序列化,此时客户端不知道您返回的类是什么样的,并且必须以任何方式进行 xml 解析......我错过了什么吗? =)

标签: c# .net vb.net reflection


【解决方案1】:

如果你的意思是动态创建一个类,那么这两个选项是:

如果您的意思是创建现有类的实例,则以Activator.CreateInstance 开头创建对象的实例,然后查看Type 上的方法,例如GetProperty,它将返回PropertyInfo你可以打电话给GetValueSetValue


更新:对于您描述的场景,从 Web 服务返回动态数据,那么我建议您不要使用这种方法,因为您很难编写代码,并且很难使用静态类型的语言。相反,正如 cmets 和其他答案之一所建议的那样,某种字典可能是更好的选择。

(请注意,当我说返回某种字典时,我是在比喻而不是字面上说,即返回在概念上与字典相同的东西,例如键值对列表。我不会直接推荐返回一个(即使您使用的是支持此功能的 WCF),因为通常最好完全控制您返回的 XML。)

【讨论】:

  • 性能差异是一个前期成本,一旦一切就绪,由 Emit 或 CodeDom 生成的代码在性能上应该是相似的。
  • 你不能在网络服务中返回字典
  • 另外,如果你使用一个数组,那么你会得到类似: w3.org/2001/XMLSchema-instance" xmlns:xsd="w3.org/2001/XMLSchema" xmlns="blah.org"> blajsd f8jsSdft43tg
  • @Russ - 我说的是比喻而不是字面意思 - 即返回概念上代表字典的东西,例如键值对序列。
【解决方案2】:

我知道这被过度简化了,为什么不只是 KISS 并生成所需的 Xml 以通过 Web 服务返回,然后解析返回的 Xml 以填充数据库。

我的理由是,出于您建议这样做的扩展原因,我可以看到想要动态类的价值或原因?

【讨论】:

    【解决方案3】:

    Eric Gunnerson 的书(A Programmer's Introduction to C#)的Execution-Time Code Generation 章节提供了有关此主题的一些重要信息。尤其参见第 14 页及以后。他概述了完成动态类/代码生成的两种主要方法(CodeDOM 和 Reflection.Emit 命名空间)。它还讨论了这两种方法的难度和性能。通读一遍,你应该会找到你可能需要的一切。

    【讨论】:

      【解决方案4】:

      真正的问题是,您需要将这些属性用于什么目的?

      会有哪些用例?您是否需要以某种方式将这些属性绑定到 UI?使用什么样的技术? (WPF、Windows 窗体?)

      只是您需要在运行时收集一组键/值对吗?那么也许一个简单的字典就可以解决问题。

      如果可以,请详细说明您需要什么,我相信这里的人们可以想出很多方法来帮助您,但是如果没有更多的上下文,很难给出一个好的答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-14
        • 1970-01-01
        • 2014-05-24
        • 1970-01-01
        相关资源
        最近更新 更多