Преобразование типов между двумя похожими объектами Datatable

У меня есть проект .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;

person Alireza    schedule 18.09.2012    source источник
comment
использовать интерфейс ICustomerDataTable?   -  person Raphaël Althaus    schedule 18.09.2012


Ответы (2)


Вы можете отделить свой набор данных от адаптеров таблиц. У вас должен быть ОДИН набор данных (с соответствующими определениями таблиц) и два набора адаптеров таблиц: один для SQL, а другой для SQL CE.

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

person Yván Ecarri    schedule 18.09.2012
comment
Спасибо за совет, звучит как хорошая практика, однако я просто решил придерживаться своего первоначального дизайна для этого проекта. - person Alireza; 25.09.2012

Разделите свой набор данных, как писал Ю. Экарри ранее.

Если это невозможно для вас, вы можете использовать шаблон декоратора для переноса данных. (Не рекомендуется!)

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;
    }
}
person oberfreak    schedule 18.09.2012
comment
спасибо за ответ, но это казалось слишком большой работой для моего проекта. - person Alireza; 25.09.2012