Присоединение свойств и методов во времени выполнения в C# 4.0?

Я работаю в той же ситуации как Вы, и я также не нашел серьезных ответов, если в основном возможно генерировать неидентификационные свойства с JPA или нет.

Мое решение состоит в том, чтобы назвать последовательность с собственным запросом JPA для установки свойства вручную прежде persisiting это.

Это не удовлетворяет, но это работает обходным решением в настоящий момент.

Mario

5
задан Web2 8 September 2009 в 13:43
поделиться

2 ответа

Ну, вы не на самом деле прикрепляете методы и свойства к объекту. Не в том, что касается CLR. Вы просто добавляете записи в словарь, и когда реализация ExpandoObject IDynamicMetaObjectProvider запрашивает значение свойства (или запрашивает выполнение метода), она будет действовать соответствующим образом.

Очевидно, что производительность будет ниже, чем у статически привязанного доступа к методам / свойствам, но DLR довольно шустрый. Меня лично беспокоит не производительность, а отсутствие безопасности типов - опечатка может легко испортить ваш код, даже если компилятор не заметит ее.

Мой личный совет - использовать динамическую типизацию только в C # 4, где это дает очень явное преимущество ... которое, как я ожидаю, будет относительно редким (например, небезопасный код).

Используется для ExpandoObject ? Не так уж и много, ИМО - в основном, когда речь идет о других динамических языках.

10
ответ дан 13 December 2019 в 05:39
поделиться

ExpandoObject относится к DLR и в первую очередь относится к игре между C # и динамическим языком (возможно, IronPython); однако в более общем смысле этот тип объекта property-bag может быть полезен, когда схема ваших типов известна только во время выполнения, возможно, на основе данных базы данных / данных конфигурации. Возможно, это пример анти-паттерна «внутренняя платформа», но он полезен в определенных сценариях для присоединения свойств во время выполнения. Конечно, для использования исключительно CLR (т.е. без вызывающих абонентов DLR) вы можете сделать это намного проще с помощью индексатора и словаря:

obj["Name"] = "Fred";
string name = (string) obj["Name"];

Для целей привязки данных, даже с этим, вы можете добиться полной привязки данных с помощью пользовательских дескрипторов свойств через ICustomTypeDescriptor или TypeDescriptionProvider .

Или для простого примера: рассмотрим DataTable ... это частично , что вы можете здесь сделать (опять же, в статическом введенный код): (непроверенный пример)

DataTable table = new DataTable();
table.Columns.Add("Name", typeof(string));
DataRow row = table.Rows.Add("Fred");
2
ответ дан 13 December 2019 в 05:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: