1

同期フレームワークを使用した .NET プロジェクトと、MS SQL および Compact SQL 用の 2 つの個別のデータセットがあります。私の基本クラスには、汎用の 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 の Type を動的に取得することで、1 行のコードのみを使用するよりスマートな方法で実行できると思います。

私の問題は設計時です。「CustomerID」などのデータテーブルのプロパティにアクセスするには、MSSQLDataSet.CustomerDataTable または CompactMSSQLDataSet.CustomerDataTable にキャストする必要があります。

関数または演算子を使用して _datatable を実行時の型に変換する方法はありますが、2 つの型間で同じ設計時のプロパティを使用することはできますか? 何かのようなもの:

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

2 に答える 2

1

Dataset を TableAdapter から分離できます。1 つのデータセット (対応するテーブル定義を含む) と 2 セットのテーブル アダプター (1 つは SQL 用、もう 1 つは SQL CE 用) が必要です。

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

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