2014-09-25 50 views
0

我正在使用查找表作爲參考。例如註冊類型,管理員,主持人然後使用工廠來確定註冊的類型。創建比較註冊的強類型方法的最簡單方法是什麼?與枚舉類似的行爲。例如數據庫查找表枚舉或類似

pssudo代碼

class regfactory 
{ 
    case()   
     if(regType.Admin: return new adminReg()  
} 

我能想到的唯一的辦法就是從數據庫中生成的神奇字符串的字典。

+0

我不認爲我理解這個問題是正確的。但是當我在數據庫的一個表中使用類型時,我在C#中創建了一個與之匹配的枚舉。因此,如果在數據庫中,我有一個表「RegistrationType」的行「1,管理員」,「2,主持人」...這些數字是表中的主鍵,所以我可以將它翻譯爲C#「enum:int {Admin = 1,主持人= 2,...}然後按照你的建議鍵入。 – Sasse 2014-09-29 07:26:18

回答

4

我想你的情況下完成強類型枚舉的唯一方法就是代碼生成。任何在編譯之前不會生成的東西都不適用於強類型。

羅伯特Koritnik發佈了非常光滑的方式來做到這一點:T4 template to Generate Enums

另一種方式來「產生」更好的可讀性枚舉名稱(如果你需要他們)是在https://github.com/MehdiK/Humanizer的HUmanizer項目。

0

從實際的角度來看,它可能看起來有點容易出錯,你可能覺得你打破了一些良好的實踐規則,不集中訪問這些數據並使其在維護期間有可能不同步但是,從架構的角度來看,考慮到我們正在討論查找數據,如果您願意,可以將它硬編碼爲「靜態數據合同」的一部分,這是可以的。

如果你確實有很多這些常量,那麼可能會出現這樣的情況,即將這些常量放在一個格式中,當這些值發生變化時,構建或數據庫補丁腳本可以更新它們,但是隻有9個填充它們在一個枚舉工作正常。

值得注意的是,一些ORM確實對枚舉有很好的支持,包括EF,如果採用代碼優先的方法,可以保持這些值同步。但是,我們正在討論爲軟件添加一個全新的層,因此您必須擁有更多的理由,而不僅僅是希望保持靜態查找數據同步來實現這一點。

0

您可以在c#中使用反射。在this answer上有一個很好的例子來列出給定名稱空間中的聲明類。

然後,您會將您的註冊類型的名稱與可用類的名稱進行比較,以確定要實例化哪個類。