获取/设置阵列属性的方法

时间:2013-06-26 12:28:47

标签: c#

我有一个Entry类,我希望通过该类将数据公开给WPF中的Gridview(通过List<Entry>)。我需要在Gridview中为Entry对象的每个属性创建一个列(对于propsA3的每个条目也会得到一列),但我不确定如何为其定义getter / setter方法数组,以便始终获取/设置基础数据的属性。

public Entry
{
  private ObjA oA;
  private ObjB[] listB;

  public int PropA1 {get {return oA.Prop1;} set {oA.Prop1 = value;}}
  public int PropA2 {get {return oA.Prop2;} set {oA.Prop1 = value;}}
  public int[] propsA3;
}

public ObjA
{
   public int Prop1 {get, set};
   public int Prop2 {get, set};

   public int getVal3(ObjB b) {return calSomethin(b);}
   public int setVal3(ref ObjB b, int val) { /*do something to ObjB*/}
}

public ObjB
{
   Byte[] data;
}

我想要的PropsA3具有以下内容的获取/设置行为:

Entry e;

获取: int a = e.propsA3[i]; =&gt; a = oA.getVal3(listB[i]);

组: e.propsA3[i] = 5; =&gt; oA.setVal3(listB[i], val);

这可能吗?如何实现这一目标或如何更改类设计以获得所需的结果?

2 个答案:

答案 0 :(得分:1)

这是可能的,但我不确定会带来什么好处,你可以使用包装类来做到这一点..例如:

public class Entry
{
    private ObjA oA;
    private ObjB[] listB;

    public int PropA1 {get {return {oA.Prop1}} set {oA.Prop1 = value;}}
    public int PropA2 {get {return {oA.Prop2}} set {oA.Prop1 = value;}}
    public EntryProperties propsA3;

    public Entry() 
    {
        propsA3 = new EntryProperties(this);
    }

    public class EntryProperties 
    {
        private Entry _entry;

        public EntryProperties(Entry entry) {
            _entry = entry;
        }

        public int this[int index] {
            get { return _entry.oA.getVal3(_entry.listB[index]); }
            set { _entry.oA.setVal3(_entry.listB[index], value); }
        }
    }
}

话虽如此,我真的不认为这是一个好主意 - 为什么不在网格中定义具有所需属性的视图模型类,然后手动设置它们,或者使用类似AutoMapper或ValueInjector的方法来实现...

答案 1 :(得分:1)

这应该有效

pulbic Entry 
{
    public ObjA propsA3 { get; set; }
}

public ObjA
{
   public int Prop1 {get, set};
   public int Prop2 {get, set};

   public int this[ObjB b]
   {
      get { return getVal(b); }
      set { /* do something*/ }
   }

   private int getVal3(ObjB b) {return calSomethin(b);}
   private int setVal3(ref ObjB b, int val) { /*do something to ObjB*/}
}