C#Open Instance委托协变和抽象数据
stackoverflow。我是C#的新手,但在C++方面有经验,并且我陷入了一个想法实现:C#Open Instance委托协变和抽象数据
我想用抽象属性(不是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以下为类型,如整数,浮点,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");
}
}
初看,你想从WPF重新发明dependency properties。至少,我看不到任何概念上的差异。
丹尼斯,非常感谢。不知道这个系统已经存在。但是,我需要在不同的平台上使用它,所以System.Windows听起来不太好。那么......是否有机会将WPF PropertySystem复制到智能代理实现中呢,还是没有希望? – JacksonRR 2013-04-29 14:15:02
在我的系统中,卡住的点是 - 通过代理与PropertyWrapper实际获取/设置器的连接。也许你可以给点建议? – JacksonRR 2013-04-29 14:36:25
@JacksonRR:我不是一个单声道开发者,但在你的情况下,我会看单声道(甚至放弃月光) - 可能是他们已经实现了DP机制。这确实不是WPF。 – Dennis 2013-04-29 17:31:59
你能显示伪代码,它描述你想要什么?什么是“财产”?它只是一个名字,或者是一个有价值的名字?如果是这样,你想如何访问该值? – Dennis 2013-04-29 10:40:11
@ Dennis,更新后 – JacksonRR 2013-04-29 12:05:40
如果我没有误解你的问题,你不能使用一个简单的Dictionary? –
Mones
2013-04-29 15:15:05