C#Open Instance委托协方差和抽象数据

时间:2013-04-29 10:09:26

标签: c# delegates covariance

计算器。我是C#的新手,但是有C ++经验,我坚持一个想法实现:

我想创建一个具有抽象属性(不是C#属性,但变量)作为基类的对象和具有这种继承的N个派生类:

ObjWithProps <-- A <-- B <-- N other classes derived one from another

属性列表是静态的,因此每个类型将初始化一次,而不是每个对象。 A和B中的每一个都可以添加具有唯一字符串表示名称的自己的抽象属性。首先,我想用 OpenInstanceDelegates 来制作它,但事实证明,代理不能协变,我是对的吗?

public delegate T OpenGetterDlg<T>(ObjWithProps instance);

我不能简单地将函数A.GetSomething()绑定到OpenGetterDlg,因为this参数不同,协方差在这里不起作用。

我可以这样做:

public delegate TPropType OpenGetterDlg<TPropType, TThisType>(TThisTypeinstance);

但是当处理

列表时,它会变成真正的痛苦
class CPropWrapper<TPropType, TInstType> where TInstType : ObjWithProps
{
  // Property ID here
  // Setter Delegate object here
  // Getter Delegate object here
}

太多演员阵容,太多类型参数,太多模板......也许有人知道C#中的那个任务怎么办?关键思路:静态道具列表,任何派生类(A,B,C,D)都可以将自己的道具添加到列表,封装和最小类型规范中。

提前致谢!

UPD1: 伪代码

class ObjWithProps
{
  class CPropertyWrapper
  {
     public string Name;
     public OpenGetterDelegate Getter;
     public OpenSetterDelegate Setter;
  }

  static List<CpropertyWrapper> AbstractProps;

  public CProperty GetPropertyByName(string name)
  {
     // Find property by name and
     return PropertyFromType(Getter());
  }
}

CProperty是int,float,myType1,myType2等类型的基础包装类。

class A: ObjWithProps
{
  int IQValue;

  public int getIQ() { return IQValue; }
  public void setIQ(int iq) { IQValue = iq; }

  protected override registerProps()
  {
    // this one should be called only once
    registerProperty<int>("IQ", "getIQ", "setIQ");
  }
}

class B: A
{
  myType1 X;

  public myType1 getX() { return X; }
  public void setX(myType1 x) { X= x; }

  protected override registerProps()
  {
    base.registerProps();
    registerProperty<myType1>("X", "getX", "setX");
  }
}

1 个答案:

答案 0 :(得分:1)

初看起来,您想从WPF重新发明dependency properties。至少,我看不出任何概念上的差异。