如何使用扩展实体在具有属性更改通知的EF6类中创建新属性



我的实体模型中有一个名为price的表。它有几个名为value0、value1、value2、value3、value4…的字段(这些是它们的字面名称,叹气..)。我不能重命名它们,也不能以任何方式更改它们。

我想要的是使用一个扩展实体来创建一个名为values的新属性。这将是一个包含value1、value2等的集合…

为了获得价值,我只需要写下价格。values[1]

我需要属性更改通知。

到目前为止,我已经尝试过了;

    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;
    }
}

这个问题是在尝试设置值时出现的。如果我试图通过写来设置一个值

prices.values[0]=someValue;

新值并不总是反映在集合中(即,当我之前设置了值,然后试图覆盖该值时)。

我愿意尝试任何能实现我目标的方法,我对修复我的解决方案并不珍惜(尽管如果有人能解释我缺少什么,那就太好了!)

您可以在不使用集合的情况下在Prices类上实现索引器。您可以使用switch来选择要写入的属性,也可以使用反射。在这种情况下,我使用反射。

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
    }
}

相关内容

  • 没有找到相关文章

最新更新