代码之家  ›  专栏  ›  技术社区  ›  Bob Wintemberg

在C#/中填充和使用动态类。NET 4.0

  •  1
  • Bob Wintemberg  · 技术社区  · 16 年前

    在我们的应用程序中,我们正在考虑使用动态生成的类来保存大量数据。这样做的原因是,我们的客户有不同结构的表。因此,您可以有一个名为“DOG”的客户表(仅此而已),其中包含“DOGID”、“DOGNAME”、“DOGTYPE”等列。customer#2可以有一个与“DOGID”、“DOG_FIRST_NAME”、“DOG_LAST_NAME”、“DOG_BREED”等列相同的表“DOG”。我们不能在编译时为它们创建类,因为客户可以随时更改表模式。

    目前,我有一些代码可以在运行时使用反射生成“DOG”类。我想弄明白的是,如何从DataTable(或其他一些.NET机制)中填充这个类,而不会造成极端的性能损失。我们有一个表,包含约20列和约50k行。对所有行和列执行foreach以创建集合大约需要1分钟,这有点太长了。

    我是在试图想出一个过于复杂的解决方案,还是我走上了正确的道路?还有谁经历过这样的问题吗?创建动态类是微软的一位开发人员提出的解决方案。如果我们能填充这个集合,并有效地使用它,我认为它可以工作。

    3 回复  |  直到 16 年前
        1
  •  3
  •   LBushkin    16 年前

    你想做的事会让你卷入其中。净3.5。你最好用字典创建一个类型<>模型中数据的键/值对。

    如果你能用。NET4.0,你可以看看 using dynamic and ExpandoObject 这个 dynamic 关键字用于创建对真正动态对象的引用- ExpandoObject 允许您轻松地动态添加属性和方法。所有这些都没有复杂的反射或代码逻辑。动态类型的好处是,DLR对运行时绑定信息执行一些复杂的缓存,以使类型比常规反射更具性能。

    如果你需要做的就是将数据加载到现有的类型,那么你应该考虑使用类似的东西。 EntityFramework 或 NHibernate 为您的类型提供ORM行为。

    为了处理数据加载性能,我建议您考虑绕过DATABATE,并将记录直接加载到正在生成的类型中。我怀疑大多数性能问题都是在从数据表中读取和转换它们原来所在的值时出现的。

        2
  •  1
  •   driis    16 年前

    你应该使用一个剖析器来找出,到底什么需要时间,然后在这方面进行优化。如果在设置数据时使用反射,则速度会很慢。缓存反射的类型数据可以节省很多时间。

    我很好奇,如果编译时不知道这些类的成员,您将如何使用它们?在这种情况下,您最好只使用一个简单的数据表?

        3
  •  1
  •   user832115    15 年前

    看看PicoPoco和Massive。这些是微型机器人。(轻量级开源ORM框架),只需将单个代码文件复制到项目中即可使用。

    Massive使用ExpandoObject并将IDataRecord转换为ExpandoObject,我认为这正是您想要的。

    PicoPoco采用一个现有的普通类,并动态高效地生成一个方法(然后顺便缓存)从数据库中加载它。