C# 两个相似数据表对象之间的类型转换

C# 两个相似数据表对象之间的类型转换,c#,.net,casting,type-conversion,C#,.net,Casting,Type Conversion,我有一个带有同步框架的.NET项目和两个分别用于MS SQL和Compact SQL的数据集。在我的基类中,我有一个通用的DataTable对象。在我的派生类中,我根据应用程序是在线操作还是离线操作,将类型化DataTable分配给泛型对象:示例: if (online) _dataTable = new MSSQLDataSet.Customer; else _dataTable = new CompactSQLDataSet.Customer; 现在,在我的代码中的每个地方

我有一个带有同步框架的.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”之类的数据表属性,必须将其强制转换为MSSQLSDataSet.CustomerDataTable或CompactMSSQLSDataSet.CustomerDataTable

有没有一种方法可以让函数或运算符将_datatable转换为其运行时类型,但仍然能够使用两种类型之间相同的设计时属性?比如:

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

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


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


如Y.Ecari之前所写,将数据集分开。

如果这对您来说是不可能的,您可以使用Decorator模式来包装数据。(不推荐!)


如Y.Ecarri之前所写,将数据集分开。

如果这对您来说是不可能的,您可以使用Decorator模式来包装数据。(不推荐!)


使用ICCustomerDataTable接口?使用ICCustomerDataTable接口?谢谢你的建议,听起来像是一个很好的实践,但是我刚刚决定坚持这个项目的初始设计。谢谢你的建议,听起来像是一个很好的实践,但是我刚刚决定坚持这个项目的初始设计。谢谢你的回答,但这对我的项目来说似乎太大了。谢谢你的回答,但对我的项目来说,这似乎太大了。
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;
    }
}