2014-09-30 58 views
1

我有一個用C#編寫的WinForms應用程序,它有很多自定義類。 許多這些Clases共享類似的屬性和方法,並且我已經能夠通過使用繼承來減少編碼。 然而,我的班也有很多類似的靜態方法(通常是從一個實現到另一個類之間的區別是參照類本身唯一的這是一個非常簡單化的例子可能是 -實現多個類通用的靜態方法

public class MyClass1() 
{ 
    public string IdentifyYourself() 
    { 
     return "This is the IdentifyYourself method in " + typeof(MyClass1).Name; 
    } 
} 

public class MyClass2() 
{ 
    public string IdentifyYourself() 
    { 
     return "This is the IdentifyYourself method in " + typeof(MyClass2).Name; 
    } 
} 

有沒有辦法概括代碼在IdentifyYourself()方法,這樣就沒有必要繼續在各實施重述類?

如果這些人不是靜態方法,然後我可以做類似

this.GetType().Name; 

但是當然,'this'關鍵字在靜態方法中不可用。

您可能想知道爲什麼這些需要是靜態方法。然而,上面的例子不是我的實際代碼,而是我遇到的問題的簡化版本。從我的代碼(但仍的較短的例子之一)的實際例子如下 -

public static DataTable List(bool active = true) 
    { 
     try 
     { 
      string table = typeof(MyClass).Name; 
      string sqlText = "SELECT * FROM [" + table + "] WHERE Active = @Active;"; 
      SqlCommand sqlCom = new SqlCommand(sqlText); 
      sqlCom.Parameters.AddWithValue("@Active", active); 
      DataTable results = Express.GetTable(sqlCom); 
      return results; 
     } 
     catch (Exception eX) 
     { 
      ... 
     } 
    } 

的代碼列表()實現從一個類的不同而不同的下一個僅在第一行

string table = typeof(MyClass).Name; 

我在想,如果我能以某種方式推廣這個,我可以按如下重新因子代碼 -

public static DataTable List(bool active = true) 
     { 
      try 
      { 
       string nameOfClass = //...some generalized way of obtained the Name of the class...// 
       return UtilityClass.List(nameOfClass); 
      } 
      ... 
     } 

它是那麼只是一對夫婦的代碼行的直複製和粘貼EAC我希望在新課程中實現這一點,所有更詳細的代碼可以放在一個工具類中。這樣做的好處不僅僅是避免在每個實現中鍵入每個類的名稱,而且如果SQL操作的細節需要更改,則只需在一個地方更改即可。

回答

3

經典的方式做這將是仿製藥:

public static DataTable List<T>(bool active = true) 
{ 
    try 
    { 
     string table = typeof(T).Name; 
     // ... 
    } .... 

var table = YourStaticClass.List<MyClass1>(); 

坦率地說,不過,我會還建議使其返回List<T>而非DataTable。這取決於Express是什麼,然而(但:「短小精悍」將是微不足道的使用做查詢到List<T>

+0

正在應用泛型在這種情況下良好,因爲代碼沒有利用任何通用提供。我們只需要班級名稱......就是這樣! – 2014-09-30 06:53:17

+1

@VimalCK a:這僅僅是一個例子,b:我們真正需要的是Type類型的實例,泛型可以是一個方便和適當的方式來實現 - 從Type中我們可以訪問屬性,屬性等等,c:注意我的建議,返回'List '而不是'DataTable'。總而言之,我很滿意這裏的一個基於泛型的解決方案。但是,「類型」也可以是一個參數。 – 2014-09-30 06:59:07