Здесь Student - это экземпляр ученика
delete Student.number;
// Пример 2
delete Student[number];
// Пример 3
delete Student["number"];
Вы можете удалить ключ объекта с приведенным выше примером. но имейте в виду, что ученик должен быть экземпляром, а не функциональным объектом
API-интерфейс Expression, который лежит в основе LINQ и т. Д., Основан на отражении ( MemberInfo
), а не на модели компонента ( PropertyDescriptor
и т. д.), поэтому нет большого требования для ITypedList
. Вместо этого содержимое выводится из T
в IQueryable
, IEnumerable
и IList
и т. Д.
Самое близкое, что вы можете получить - это IListSource
, но это все равно будет просто поверхностная оболочка вокруг правильного типизированного списка.
Если производительность привязки во время выполнения (до PropertyDescriptor
) является ключевым, вы можете посмотреть на HyperDescriptor - который использует Отражение. Emit
и TypeDescriptionProvider
, чтобы обернуть компонентную модель.
Re "почему" и т. Д .; обратите внимание, что почти во всех случаях с LINQ-to-SQL и EF выражение
(или часть «создание и установка членов») будет скомпилировано с делегатом до его вызова - так что во время выполнения нет огромных затрат на отражение. И аналогично, с LINQ-to-Objects все уже уже скомпилировано (компилятором C #).
Если посмотреть на то, что MSDN говорит о привязке данных LINQ to SQL, то кажется, что использовать IListSource или IBindingList.
Кстати, LINQ использует Деревья выражений , и это не столько отражение, сколько метапрограммирование. Производительность должна быть намного лучше, чем отражение. Чарли Калверт освещает это немного в этой статье .
Из моего опыта работы с LINQ to SQL я пришел к выводу по нескольким причинам, что LINQ использует отражение для установки и получения значения полей в экземплярах класса сущностей. Я не знаю, смогу ли я вспомнить все причины, но вот что я могу вам сказать.
Я думаю, что это делает это для обеспечения простоты - вы можете полагаться на значения в полях в классе сущностей, непосредственно отражающих значения столбца базы данных, и нет особых накладных расходов при извлечении объекта из базы данных (заполнении вновь созданного сущность, соответствующая значениям, полученным из базы данных, не должна маршрутизироваться через процедуры свойств). Например, одна вещь, которую я сделал для представления перечисляемых значений, извлеченных из базы данных, - это сделать некоторые из сгенерированных LINQ свойств частными и обернуть их в закодированное вручную свойство в частичном классе, который читает и записывает свойство LINQ.
не требует больших затрат при извлечении объекта из базы данных (заполнение вновь созданного объекта в соответствии со значениями, полученными из базы данных, не должно проходить через процедуры свойств). Например, одна вещь, которую я сделал для представления перечисляемых значений, извлеченных из базы данных, - это сделать некоторые из сгенерированных LINQ свойств частными и обернуть их в закодированное вручную свойство в частичном классе, который читает и записывает свойство LINQ. не требует больших затрат при извлечении объекта из базы данных (заполнение вновь созданного объекта в соответствии со значениями, полученными из базы данных, не должно проходить через процедуры свойств). Например, одна вещь, которую я сделал для представления перечисляемых значений, извлеченных из базы данных, - это сделать некоторые из сгенерированных LINQ свойств частными и обернуть их в закодированное вручную свойство в частичном классе, который читает и записывает свойство LINQ.