代码之家  ›  专栏  ›  技术社区  ›  mark_h

如何使用扩展实体在EF6类中创建一个新属性,并通知属性更改?

  •  0
  • mark_h  · 技术社区  · 8 年前

    我的实体模型中有一个叫做价格的表。它有几个字段名为value0、value1、value2、value3、value4…(这些是它们的字面名称,叹息…)。我无法重命名或以任何方式更改它们。

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

    为了获得这些值,我只需要写下prices.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;
        }
    }
    

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

    价格。值[0]=someValue;

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

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   bubi    8 年前

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

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