2013-04-29 44 views
0

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

你能顯示僞代碼,它描述你想要什麼?什麼是「財產」?它只是一個名字,或者是一個有價值的名字?如果是這樣,你想如何訪問該值? – Dennis 2013-04-29 10:40:11

+0

@ Dennis,更新後 – JacksonRR 2013-04-29 12:05:40

+0

如果我沒有誤解你的問題,你不能使用一個簡單的Dictionary ? – Mones 2013-04-29 15:15:05

回答

1

初看,你想從WPF重新發明dependency properties。至少,我看不到任何概念上的差異。

+0

丹尼斯,非常感謝。不知道這個系統已經存在。但是,我需要在不同的平臺上使用它,所以System.Windows聽起來不太好。那麼......是否有機會將WPF PropertySystem複製到智能代理實現中呢,還是沒有希望? – JacksonRR 2013-04-29 14:15:02

+0

在我的系統中,卡住的點是 - 通過代理與PropertyWrapper實際獲取/設置器的連接。也許你可以給點建議? – JacksonRR 2013-04-29 14:36:25

+0

@JacksonRR:我不是一個單聲道開發者,但在你的情況下,我會看單聲道(甚至放棄月光) - 可能是他們已經實現了DP機制。這確實不是WPF。 – Dennis 2013-04-29 17:31:59