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");
}
}
你能顯示僞代碼,它描述你想要什麼?什麼是「財產」?它只是一個名字,或者是一個有價值的名字?如果是這樣,你想如何訪問該值? – Dennis 2013-04-29 10:40:11
@ Dennis,更新後 – JacksonRR 2013-04-29 12:05:40
如果我沒有誤解你的問題,你不能使用一個簡單的Dictionary? –
Mones
2013-04-29 15:15:05