Как я могу использовать расширенную сущность для создания нового свойства в моем классе 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
    }
}
Другие вопросы по тегам