2012-09-18 72 views
1

我有.NET項目同步框架和兩個單獨的數據集的MS SQL和Compact SQL。在我的基類中,我有一個通用的DataTable對象。在我的派生歸入我指定類型的DataTable基於應用程序是否在線或離線操作的通用對象:例如:兩個類似的數據表對象之間的類型轉換

if (online) 
    _dataTable = new MSSQLDataSet.Customer; 
else 
    _dataTable = new CompactSQLDataSet.Customer; 

現在在我的代碼的每一個地方我都基於當前檢查,並做了投網絡模式是這樣的:

public void changeCustomerID(int ID) 
{ 
    if (online) 
     (MSSQLDataSet.CustomerDataTable)_dataTable)[i].CustomerID = value; 
    else 
     (CompactMSSQLDataSet.CustomerDataTable)_dataTable)[i].CustomerID = value; 
} 

,但我不認爲這是非常有效的,我相信它可以在一個更聰明的方式來完成,以通過動態獲取_dataTable的類型上來說只用一行代碼時間。

我的問題是在設計時,爲了訪問諸如「CustomerID」之類的數據表格屬性,它必須被轉換爲MSSQLDataSet.CustomerDataTable或CompactMSSQLDataSet.CustomerDataTable。

有沒有辦法讓函數或操作符將_datatable轉換爲其運行時類型,但是仍然能夠使用它的兩種類型的設計時間屬性?類似於:

((aType)_dataTable)[i].CustomerID = value; 
//or 
GetRuntimeType(_dataTable)[i].CustomerID = value; 
+3

使用ICustomerDataTable接口? –

回答

1

您可以將您的數據集與TableAdapter分開。您應該有一個數據集(具有相應的表定義)和兩組表適配器:一個用於SQL,另一個用於SQL CE。

http://msdn.microsoft.com/en-us/library/bb384570.aspx

+0

感謝您的建議,聽起來像一個很好的做法,但我只是決定堅持我的這個項目的最初設計。 – Alireza

0

單獨的數據集中爲Y. Ecarri之前寫的。

如果這對您不可行,您可以使用裝飾模式來包裝數據。 (不推薦!)

public interface ICustomer{ 
    ICustomerData GetCustomerData(int index); 
} 

public interface ICustomerData{ 
    int CustomerId{ get; } 
} 

public class OnlineCustomer : ICustomer{ 

    private MSSQLDataSet.Customer innerCustomer; 

    public OnlineCustomer(MSSQLDataSet.Customer innerCustomer){ 
     this.innerCustomer = innerCustomer; 
    } 
    ICustomerData GetCustomerData(int index){ 
     return new OnlineCustomerData(innerCustomer[index]); 
    } 
} 

public class OnlineCustomerData : ICustomerData{ 
    private MSSQLDataSet.CustomerDataTable innerCustomer; 
    public OnlineCustomerData(MSSQLDataSet.CustomerDataTable innerCustomer){ 
     this.innerCustomer = innerCustomer; 
    } 

    public int CustomerId{ 
     get { 
      return innerCustomer.CustomerId; 
     } 
    } 
} 

public class OfflineCustomerData : ICustomerData{ 
    private CompactSQLDataSet.CustomerDataTable innerCustomer; 
    public OfflineCustomerData(CompactSQLDataSet.CustomerDataTable innerCustomer){ 
     this.innerCustomer = innerCustomer; 
    } 

    public int CustomerId{ 
     get { 
      return innerCustomer.CustomerId; 
     } 
    } 
} 

public class OfflineCustomer : ICustomer{ 

    private CompactSQLDataSet.Customer innerCustomer; 

    public OfflineCustomer(CompactSQLDataSet.Customer innerCustomer){ 
     this.innerCustomer = innerCustomer; 
    } 
    ICustomerData GetCustomerData(int index){ 
     return new OfflineCustomerData(innerCustomer[index]); 
    } 
} 

public class Program{ 
    private ICustomer customer; 

    public ICustomer Customer{ 
     get{ 
      if(customer == null) 
       customer = CreateCustomer(); 
      retrun customer; 
     } 
    } 

    public ICustomerData CreateCustomer(){ 
     if(online){ 
      new OnlineCustomer(new MSSQLDataSet.Customer); 
     } else { 
      new OfflineCustomer(new CompactSQLDataSet.Customer); 
     } 
    } 

    public void Usage(){ 
     ICustomerData data12 = Customer.GetCustomerData(12); 
     int id = data12.CustomerId; 
    } 
} 
+0

感謝您的回答,但這對我的項目來說似乎太大了。 – Alireza