Я хотел бы знать, как динамически добавлять неопределенное количество неименованных свойств для объекта. В настоящее время мы используем DataTable и динамически добавляем столбцы, а затем привязываем эту таблицу к UltraGrid; Я хотел бы воспроизвести это с помощью сущности. Обратите внимание, что я использую инфраструктуру Entity N-Tier (https://ntieref.codeplex.com/).
Я мог либо динамически создавать объект со свойствами, либо динамически добавлять свойства к существующему объекту, который не содержит каких-либо отображаемых свойств. Каждый раз, когда приложение запускается, будет добавлено другое количество свойств, поэтому мне не нужно постоянно сохранять новые/динамические свойства. Я хочу иметь возможность привязывать EntitySet как источник данных для UltraGrid; Я не буду использовать этот объект для изменения данных напрямую, только для доступа к отслеживанию состояния.
Я нашел класс DynamicPropertyHelper в библиотеке Entity Framework N-Tier, но не смог определить, для чего он используется.
Мои объекты уже наследуются от другого класса и поэтому не могут наследовать от ExpandoObject.
Вот некоторые связанные должности, но я не думаю, что они являются ответом, которого я ищу.
Динамически добавлять новое свойство с любым именем в объект
Я хотел бы думать, что у сущностей есть как минимум такая функциональность, как наборы данных...
Я был бы признателен за любую помощь, даже если ответ заключается в том, что это невозможно сделать.
Спасибо.
Вы можете разрешить сущностям поддерживать динамические свойства, переопределяя защищенные методы GetDynamicValue
и SetDynamicValue
.
Это зависит от вас, как значения динамических свойств хранятся и отображаются через контракт данных WCF. Однако вы можете использовать DynamicPropertyHelper
для выполнения этой задачи. Помощник использует двоичную сериализацию и кодировку base-64 для хранения всех динамических свойств в виде строки XML. Вот пример:
partial class MyEntity
{
[DataMember]
[SimpleProperty]
private string DynamicContent
{
get { return _dynamicContent; }
set
{
if (_dynamicContent != value)
{
OnPropertyChanging("DynamicContent", value);
var previousValue = _dynamicContent;
_dynamicContent = value;
OnPropertyChanged("DynamicContent", previousValue, value);
}
}
}
private string _dynamicContent;
protected override object GetDynamicValue(string propertyName)
{
return DynamicPropertyHelper.GetDynamicProperty(DynamicContent, propertyName);
}
protected override void SetDynamicValue(string propertyName, object value)
{
var dynamicContent = DynamicContent;
DynamicPropertyHelper.SetDynamicProperty(ref dynamicContent, propertyName, value);
DynamicContent = dynamicContent;
}
}
Затем вы можете просто установить и получить динамические значения свойств с помощью индексатора сущностей:
MyEntity x = ...;
x["DynamicPropertyName"] = dynamicPropertyValue;