2015-10-12 29 views
1

我確實有很多靜態類表示不同模塊中的不同狀態。但是他們共享提取其信息的常用算法。替代:靜態類作爲通用參數

public static class Constants 
{ 
    public static readonly int A = 0; 
} 

所以現在我有,這是否每個類多個靜態功能。它們僅在處理的靜態類的類型(及其全名)方面有所不同。

public static SelectListItem getConstantsSelectListItem() 
{ // pseudo example 
    return new SelectListItem { Text = "A" , Value = Constants.A }; 
} 

要刪除當前和避免未來的codebloat,我想對靜態類使用反射。這裏是我的方法,這將做的工作(如果有可能):

public static ReturnType getProperties<T>() 
{ // basically same logic as getConstantsSelectListItem 
    var propertyList = typeof(T) .GetFields(BindingFlags.Public | BindingFlags.Static).ToList(); 

    foreach(var item in propertyList) 
    { 
     var curConstant = (int)(item.GetValue(null)); 

     // do some work here.. 
    } 
} 

var constantsProperties = getProperties<Constants>(); 

的錯誤是:

static types cannot be used as argument types 

我已閱讀,對於仿製藥僅實例(因此沒有靜態類)可以使用。

什麼是做出類似工作的好方法?

+0

可能重複[C# - 靜態類型不能用作類型參數](http://stackoverflow.com/questions/5858591/c-sharp-static-types-cannot-be-used-as-type-arguments ) – C1sc0

回答

1

問題C# - static types cannot be used as type arguments很好地解釋了這種行爲的意圖。

它沒有告訴你應該做什麼。在我看來,你可以使用單例模式來保存該類的一個實例。這樣做的一個好處是你也可以使用繼承,所以你不需要反射就可以完成你現在做的伎倆,你可以只依賴基類的方法簽名。

1

您只需傳遞一個Type對象作爲參數,而不是使用泛型。因爲無論如何你必須做typeof(T) .GetFields(,它不像你有任何靜態類型的安全,你失去了。

我強烈建議的另一個建議是使用字典將字符串映射到整數來表示您的常量集合。像這樣使用反射只會給你帶來痛苦,因爲沒有很好的理由,對開發者實施奇怪的幾乎儀式化的規則(「這個靜態類是魔術,不會添加任何字符串」),並且性能更差。