2010-05-11 97 views
3

我正在處理一個巨大的,有很多脆弱代碼的舊項目,其中一些已經出現在.NET 1.0時代以後,並且它已經被其他人使用過了......因此, d喜歡儘可能少地改變。我可以創建從強類型DataRow繼承的自定義類嗎?

我在我的解決方案中包含一個項目,其中包含DataSet.xsd。該項目編譯爲一個單獨的程序集(Data.dll)。數據庫模式包括幾個分層次排列的表,但這些表實際上鍊接在一起的唯一方式是通過連接。我可以得到,例如DepartmentRowEmployeeRow來自自動生成代碼的對象。 EmployeeRow包含員工相應的DepartmentRow通過加入的信息。

我正在製作一份新報告以查看多個部門及其所有員工。如果我使用現有的數據訪問方案,我將能夠得到的是類似電子表格的輸出,其中每個員工都在一行中表示,部門信息在其適當的列中反覆重複。例如:

Department1...Employee1... 
Department1...Employee2... 
Department2...Employee3... 

但是客戶希望每個部門都像一個標題一樣呈現,每個部門都有一個員工名單。例如:

- Department1... 
     Employee1... 
     Employee2... 
+ Department2... 

我想通過從自動生成的Row對象繼承分層對象來做到這一點。例如: -

public class Department : DataSet.DepartmentRow { 
    public List<Employee> Employees; 
} 

這樣,我可以通過嵌套使用部門的集合在報表中的數據對象作爲數據源,每個將放置在一個報表員工的名單。

問題是,這給我一個The type Data.DataSet.DepartmentRow has no constructors defined錯誤。當我嘗試構造一個構造函數時,例如

public class Department : DataSet.DepartmentRow { 
    private Department() { } 
    public List<Employee> Employees; 
} 

我得到一個錯誤'Data.DataSet.DepartmentRow(System.Data.DataRowBuilder)' is inaccessible due to its protection level.除了第一個。

有沒有辦法完成我想要做的事情?還是有什麼我應該完全嘗試?

+1

我覺得你的痛... – SLaks 2010-05-11 19:00:06

回答

1

我終於想通了,有以下好處解決方法:

  1. 我沒有一個朋友添加到數據彙編;我只需修改通常進行修改的程序集部分中的一個文件。
  2. 我沒有改變自動生成的代碼將盡快覆蓋,因爲它是重新生成

在代碼隱藏文件中的數據集(數據集。CS,通過擴大DataSet.xsd)在VS2008 acessed,我添加新的部分的類定義,增加的公共構造具有不同的簽名,但其是功能上等同於現有的內部構造:

public partial class DataSet { 
    public partial class DepartmentRow { 
     public DepartmentRow(global::System.Data.DataRowBuilder rb, string discard) : this(rb) { } 
    } 
    public partial class EmployeeRow { 
     public EmployeeRow(global::System.Data.DataRowBuilder rb, string discard) : this(rb) { } 
    } 
} 

然後,我可以在我的派生類中使用此構造函數:

public class Department : DataSet.DepartmentRow { 
    public Department(global::System.Data.DataRowBuilder DataRowBuilder rb) : base(rb, "discard") { } 

    public List<Employee> Employees; 

    public string[] SomeFrequentlyUsedGroupOfFields { 
     get { 
      return new string[] { this.OneField, this.AnotherField }; 
     } 
    } 

    public bool CanUserSeeDepartmentInformation(int UserID) { } 
} 

瞧!

不幸的是,實現這一結果後,我意識到,這是沒有多大用處,因爲在DataSetTableAdapters.DepartmentTableAdapter自動生成的代碼仍然返回DataSet.DepartmentRow類型的對象,我將不得不垂頭喪氣讓我Department對象,具有額外的性能/方法。這是不允許的,我看不出一個簡單的方法來解決這個問題。

我可以將所有新成員移動到部分類代碼隱藏,但我不確定哪些架構規範會違反。 (似乎有一些任意應用的數據邏輯和業務邏輯之間的區別。)

4

我能夠在快速測試中從數據行繼承。請注意,這與數據行類在同一個程序集中。數據行類的構造函數被標記爲'internal'。

using System; 
using System.Data; 

namespace Blah 
{ 
    /// <summary> 
    /// Summary description for Class1. 
    /// </summary> 
    public class Class1 : MyDataSet.MyTableRow 
    { 
     public Class1(DataRowBuilder rb) : base(rb) 
     { 
      // 
      // TODO: Add constructor logic here 
      // 
     } 
    } 
} 
+0

我已經測試過這個項目。儘管我明白你爲什麼願意,但我仍然不會在自己的代碼中這樣做。 – chilltemp 2010-05-11 19:27:19

+0

您是否使用不同的程序集中的DataSet進行了嘗試?我嘗試了這個例子,並得到了「由於其保護級別而無法訪問」的錯誤。 – 2010-05-11 19:30:57

+1

您不能在不修改原始代碼中的訪問器的情況下在不同的程序集中執行此操作。 – chilltemp 2010-05-11 19:34:18

相關問題