Почему LinqPad создает поля вместо свойств?

Недавно я взялся за проект по созданию инструмента для LinqPad, который будет выгружать результаты запросов в формат CSV, чтобы использовать этот инструмент в больших базах данных для получения быстрых результатов. Одна вещь, которую я хотел от этого инструмента, это чтобы он мог работать в Visual Studio и LinqPad. Таким образом, если бы я использовал LinqtoSQL в VS2010 или LinqPad, я мог бы быстро вывести результаты в CSV-файл, а затем открыть его в Excel для просмотра результатов.

Самый большой сбой в проекте возник из-за того, как LinqPad строит свои DataContexts по сравнению с тем, как Visual Studio строит свои DataContexts. Лучшая информация о том, как работает LinqPad, взята из здесь. В основном то, что я обнаружил в своем проекте, заключалось в том, что VS2010 создает свойства для своих контекстов данных, а 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 использует поля вместо свойств в своих контекстах данных? Не было бы более целесообразным скопировать шаблон Visual Studio LinqToSQL?

Обновить

Основываясь на комментарии, я решил задать тот же вопрос в форум LinqPad.


person jsmith    schedule 14.04.2011    source источник
comment
Разве это не должно быть адресовано авторам LinqPad? :D Во всяком случае, и FieldInfo, и PropertyInfo наследуются от MemberInfo, так что вы можете переписать свой код для обработки обоих случаев (с небольшими изменениями).   -  person Jonas    schedule 14.04.2011
comment
@Jonas Это все еще хорошая информация для StackOverFlow. И хотя они оба наследуются от MemberInfo, у них обоих разные методы GetValue(), которые я должен использовать оба.   -  person jsmith    schedule 14.04.2011


Ответы (1)


Это хороший вопрос. Основная причина, по которой LINQPad использует поля для сопоставления столбцов, заключается в повышении производительности при построении типизированного DataContext, поддерживающего запросы, подключенные к базе данных.

Мы не говорим о скорости выполнения самих свойств (на самом деле при выполнении простых методов доступа очень мало накладных расходов, и JIT может даже встроить их). Накладные расходы возникают при построении типизированного DataContext через Reflection.Emit. Поле — это просто: один элемент метаданных, тогда как свойство требует создания определения поля, определения свойства, двух методов для средств доступа (каждый с IL для получения/установки базового поля). Поскольку пользователи могут указать LINQPad на базы данных с более чем 1000 таблиц и функций, это может увеличиться с точки зрения времени, необходимого для создания сборки, а также ее размера (увеличение активности жесткого диска и рабочего набора).

Вы подняли интересный вопрос об отсутствии унификации между PropertyInfo и FieldInfo в объектной модели отражения. Было бы неплохо, если бы существовал интерфейс, объединяющий поля и (неиндексированные) свойства.

person Joe Albahari    schedule 15.04.2011
comment
Благодарю вас! Да, меня тоже не радовало отсутствие унификации между двумя классами. - person jsmith; 15.04.2011