0

堆栈溢出。我是 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# 中完成这项任务?关键思想:静态props列表,任何派生类(A、B、C、D)都可以将自己的props添加到列表中,封装和最小化类型规范。

提前致谢!

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

1 回答 1

1

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

于 2013-04-29T12:20:37.090 回答