堆栈溢出。我是 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");
}
}