Я работаю в той же ситуации как Вы, и я также не нашел серьезных ответов, если в основном возможно генерировать неидентификационные свойства с JPA или нет.
Мое решение состоит в том, чтобы назвать последовательность с собственным запросом JPA для установки свойства вручную прежде persisiting это.
Это не удовлетворяет, но это работает обходным решением в настоящий момент.
Mario
Ну, вы не на самом деле прикрепляете методы и свойства к объекту. Не в том, что касается CLR. Вы просто добавляете записи в словарь, и когда реализация ExpandoObject
IDynamicMetaObjectProvider
запрашивает значение свойства (или запрашивает выполнение метода), она будет действовать соответствующим образом.
Очевидно, что производительность будет ниже, чем у статически привязанного доступа к методам / свойствам, но DLR довольно шустрый. Меня лично беспокоит не производительность, а отсутствие безопасности типов - опечатка может легко испортить ваш код, даже если компилятор не заметит ее.
Мой личный совет - использовать динамическую типизацию только в C # 4, где это дает очень явное преимущество ... которое, как я ожидаю, будет относительно редким (например, небезопасный код).
Используется для ExpandoObject
? Не так уж и много, ИМО - в основном, когда речь идет о других динамических языках.
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");