Linq to sql 为什么LinqPad创建字段而不是属性?

Linq to sql 为什么LinqPad创建字段而不是属性?,linq-to-sql,reflection,properties,field,linqpad,Linq To Sql,Reflection,Properties,Field,Linqpad,我最近承担了一个为LinqPad创建工具的项目,该工具将查询结果转储为CSV格式,以便在海量数据库上使用该工具以获得快速结果。我想从这个工具中得到的一件事是它能够在VisualStudio和LinqPad中工作。因此,如果我在VS2010或LinqPad中使用LinqtoSQL,我可以将结果快速转储到csv文件中,然后将其打开到Excel以查看结果 项目中最大的问题来自LinqPad如何构建其数据上下文,而Visual Studio如何构建其数据上下文。我能找到的关于LinqPad是如何做到这一

我最近承担了一个为LinqPad创建工具的项目,该工具将查询结果转储为CSV格式,以便在海量数据库上使用该工具以获得快速结果。我想从这个工具中得到的一件事是它能够在VisualStudio和LinqPad中工作。因此,如果我在VS2010或LinqPad中使用LinqtoSQL,我可以将结果快速转储到csv文件中,然后将其打开到Excel以查看结果

项目中最大的问题来自LinqPad如何构建其数据上下文,而Visual Studio如何构建其数据上下文。我能找到的关于LinqPad是如何做到这一点的最好信息来自于。基本上,我从我的项目中发现,VS2010为它们的DataContext创建属性,而LinqPad创建字段。因此,在使用反射时:

林帕德:

dataContextType.GetProperties() //returns 0
dataContextType.GetFields() //returns the Fields from LinqPad created DataContext
VS 2010 LinqToSQL:

dataContextType.GetProperties() //returns the Properties from VS created DataContext
dataContextType.GetFields() //returns 0
那么为什么LinqPad在其数据上下文中使用字段而不是属性呢?复制VisualStudioLinqtoSQL模式不是更可行吗

更新


根据一条评论,我决定在内部也问同样的问题。

这是一个好问题。LINQPad使用字段映射列的主要原因是为了在构建支持数据库连接查询的类型化DataContext时提高性能

我们不是在讨论执行属性本身的速度(实际上执行简单访问器的开销很小,JIT甚至可以内联它们。)开销是通过Reflection.Emit构建类型化DataContext时的开销。字段就是:一项元数据,而属性需要发出字段定义、属性定义和访问器的两个方法(每个方法都带有IL来获取/设置基础字段)。因为用户可能会将LINQPad指向包含1000多个表和函数的数据库,这就增加了构建程序集所需的时间以及其大小(增加了HDD活动和工作集)


您提出了一个有趣的问题,即反射对象模型中PropertyInfo和FieldInfo之间缺乏统一。如果有一个接口可以统一字段和(非索引)属性,那就太好了。

这不应该指向LinqPad的作者吗无论如何,FieldInfo和PropertyInfo都继承自MemberInfo,因此您可以重写代码来处理这两种情况(稍加调整)。@Jonas这仍然是StackOverFlow的好信息。虽然它们都是从MemberInfo继承的,但它们都有不同的GetValue()方法,我必须同时使用它们。谢谢!是的,我很不高兴看到两个阶级之间缺乏统一。