C#开放实例委托协方差和抽象数据

本文关键字:方差 抽象 数据 实例 | 更新日期: 2023-09-27 18:11:23

stackoverflow。我是C#的新手,但有C++的经验,我只能实现一个想法:

我想制作一个具有抽象属性(不是C#属性,而是变量(的对象作为基类,并使用这样的继承创建N个派生类:

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

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

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

C#开放实例委托协方差和抽象数据

乍一看,您想要从WPF中重新发明依赖属性。至少,我看不出任何概念上的差异。