2011-10-26 44 views
3

在棱鏡應用程序,我有一個模塊的定義是這樣的:C#未使用的字段

[Module(ModuleName = "TestModule", OnDemand = true)] 
public class Test : 
    ModelBase, 
    IModule 
{ 
    ... 
    moduleName = "TestModule"; 
    ... 
}; 

正如你所看到的,將這些模塊在運行時加載,有很多人用不同的模塊名稱。

爲了避免代碼冗餘,我寫了一個基類模型庫從這些模型推導如下:

public class ModelBase: 
{ 
    /// <summary> 
    /// The module name 
    /// </summary>   
    protected string moduleName; 
    ... 
} 

字符串MODULENAME永遠不會在模型庫中,所以我得到的編譯器這很簡單的說明了CS0169。 我不喜歡壓制警告,所以我想知道是否有更好的解決方案。

moduleName將在派生類中設置爲實際名稱,如您在第一個片段中所看到的。

問題是,無法在ModelBase類中分配名稱,因爲此處未提前知道模塊的名稱。

這個問題可能聽起來很蠢,因爲一個能寫

public class ModelBase: 
{ 
    /// <summary> 
    /// The module name 
    /// </summary>   
    protected string moduleName = ""; 
    ... 
} 

來解決這個問題。

我不知道是否有這種經常性問題的「最佳做法」。 非常感謝

克林斯曼

+1

非私有,不恆定的領域是一個代碼氣味,IMO。爲什麼不在這裏使用(可能是抽象的)屬性? – Ani

回答

6

我會親自使這是一個抽象屬性:

protected abstract string ModuleName { get; } 

額外的好處,這將迫使派生類來實現它,這應該減少出錯的可能性。如果您的使用ModuleName應公開,您當然也可以公開該財產。

類似的替代辦法是使這個類的構造函數的參數:

protected ModelBase(string name) 
{ 
    this.moduleName = name; 
} 

這將再次迫使這在每個派生類的構造函數的一部分來處理。

+0

這也是我的第一個猜測。 – Ucodia

+0

非常好,非常感謝這個提示! – Juergen

1

那麼,你可以考慮初始化模塊名在構造函數中或作爲成員變量定義的一部分null,因爲System.String是引用類型。

2

假設ModuleBase類可以被安裝,如果它們中存在字符串,它們應該分配一個名稱。

如果它們不應該被實例化,請考慮使ModuleBase成爲一個抽象類。

1

使模型基礎成爲抽象類,然後將模型名稱定義爲absract只讀屬性,如下所示...

Protected abstract string modelname { get; } 

這將確保派生類給出一個型號名稱