Как я могу использовать расширенную сущность для создания нового свойства в моем классе EF6 с уведомлением об изменении свойства?
У меня есть таблица в моей модели сущности под названием цены. У него есть несколько полей с именами value0, value1, value2, value3, value4... (это их буквальные имена, sigh..). Я не могу переименовать их или каким-либо образом изменить их.
Я хотел бы использовать расширенную сущность для создания нового свойства, называемого значениями. Это будет коллекция, содержащая значение1, значение2 и т. Д.
Чтобы получить доступ к значениям, мне нужно было бы просто написать прайс-лист.
Мне нужно уведомление об изменении свойства для этого.
До сих пор я пробовал это;
public partial class Prices
{
private ObservableCollection<double?> values = null;
public ObservableCollection<double?> Values
{
get
{
if (values != null)
values.CollectionChanged -= values_CollectionChanged;
else
values = new ObservableCollection<double?>(new double?[14]);
values[0] = value0;
values[1] = value1;
values[2] = value2;
values.CollectionChanged += values_CollectionChanged;
return values;
}
private set
{
value0 = value[0];
value1 = value[1];
value2 = value[2];
}
}
private void values_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
Values = values;
}
}
Проблема возникает при попытке установить значения. если я попытаюсь установить значение, написав
цена.значения [0] = someValue;
Новое значение не всегда отражается в коллекции (т. Е. Когда я предварительно установил значение, а затем попытался перезаписать значение).
Я готов попробовать любой подход, который достиг бы моей цели, я не ценю исправление своего решения (хотя, если кто-нибудь и сможет объяснить, что мне не хватает, это было бы здорово!)
1 ответ
Вы можете реализовать индексатор для класса цен без использования коллекции. Вы можете использовать переключатель, чтобы выбрать свойство для записи или вы можете использовать отражение. В этом случае я использую отражение.
public double? this[int index]
{
get
{
if (index < 0 || index > 13) throw new ArgumentOutOfRangeException("index");
string propertyName = "Value" + index;
return (double?)GetType().GetProperty(propertyName).GetValue(this);
}
set
{
if (index < 0 || index > 13) throw new ArgumentOutOfRangeException("index");
string propertyName = "Value" + index;
GetType().GetProperty(propertyName).SetValue(this, value);
// Raise your event here
}
}