在两个类似的Datatable对象之间键入转换

时间:2012-09-18 09:36:16

标签: c# .net casting type-conversion

我有带有同步框架的.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;

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

将您的DataSet分隔为Y. Ecarri先前写道。

如果您无法做到这一点,可以使用Decorator模式来包装数据。 (不推荐!)

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;
    }
}
相关问题