Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.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 4.0中填充和使用动态类_C#_Collections_Dynamic_Datatable_Reflection.emit - Fatal编程技术网

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

在C#/.NET 4.0中填充和使用动态类,c#,collections,dynamic,datatable,reflection.emit,C#,Collections,Dynamic,Datatable,Reflection.emit,在我们的应用程序中,我们正在考虑使用动态生成的类来保存大量数据。这样做的原因是我们的客户的表具有不同的结构。因此,您可以有一个名为“DOG”的customer表(仅此而已),其中包含“DOGID”、“DOGNAME”、“DOGTYPE”等列。customer#2可以有一个与“DOGID”、“DOG_FIRST_NAME”、“DOG_LAST_NAME”、“DOG_BREED”等列相同的表“DOG”。我们不能在编译时为它们创建类,因为客户可以随时更改表模式 目前,我有一些代码可以在运行时使用反射生

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

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


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

您应该使用探查器来找出具体需要花费的时间,然后在此基础上进行优化。如果在设置数据时使用反射,则速度会很慢。通过缓存反射的类型数据可以节省很多


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

您应该使用探查器来确定具体需要多少时间,然后在此基础上进行优化。如果在设置数据时使用反射,则速度会很慢。通过缓存反射的类型数据可以节省很多


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

在.NET3.5中,您试图做的事情会变得相当复杂。您最好为模型中的数据创建一个具有键/值对字典的类型

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

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


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

在.NET 3.5中,您试图执行的操作将变得相当复杂。您最好为模型中的数据创建一个具有键/值对字典的类型

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

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


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

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

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


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

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

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


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

DataTable对于我们正在尝试的操作来说太慢了。我们当前正在使用DataTable进行实现。DataTable对于我们尝试执行的操作来说太慢了。我们目前正在使用DataTable进行实现。使用ORM来实现这一点是很好的,但是由于我们的表可以在不通知的情况下更改,所以ORM无法工作。我看过.NET4.0中的动态特性,但问题是我们在编译时不知道属性的名称,所以动态特性似乎不起作用。如果我错了,请纠正我。我们也在研究一种使用字典的解决方案,但在我们尝试之前,我不确定它是否有效。我们面临的问题是如何将数据加载到我们正在生成的类型中。有没有