1

我有带有同步框架的 .NET 项目和两个单独的 MS SQL 和 Compact SQL 数据集。在我的基类中,我有一个通用的 DataTable 对象。在我的派生类中,我根据应用程序是在线还是离线操作,将 Typed 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;
4

2 回答 2

1

您可以将数据集与 TableAdapters 分开。您应该有一个数据集(具有相应的表定义)和两组表适配器:一组用于 SQL,另一组用于 SQL CE。

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

于 2012-09-18T10:55:45.220 回答
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;
    }
}
于 2012-09-18T10:59:01.900 回答