1

データベースからデータをロードするクラスがあります。このクラスには、実際にデータをロードして、DataTableの形式で呼び出し元の関数に返す関数があります。

次に、DataTableを反復処理し、各行に基づいてさまざまなクラスのオブジェクトを作成します。

私がやりたいのは、フローを変更して、作成するオブジェクトのタイプを判別できるようにデータをロードする関数を呼び出すことができるようにすることです。これが私がかけたい電話のタイプを示すための2つの疑似電話です:

List<Teacher> =this.loadData(String sql, Hashtable data, {teachers class});
List<Student> = this.loadData(String sql, Hashtable data, {students class});

現在、教師と生徒のクラスは共通のクラスを拡張していません。しかし、それが役に立ったら、私はそのような変更を加えることができます。

リー

アップデート:

これまでに回答してくださった皆様、ありがとうございました。どのソリューションも、私が持っているコードを実際に改善したり、プログラミングスキルを超えたりすることはないようです。

私はこの投稿を見つけました:文字列からクラスのインスタンスを作成します

そこで誰かが文字列からクラスを作成するための次のテクニックに言及しています:System.Reflection.Assembly.GetExecutingAssembly()。CreateInstance(string className)

ただし、結果のオブジェクトを実際のクラスにキャストする必要があるとも言われています。したがって、(キャストする前に)結果のクラスをリストに入れるかどうか疑問に思います。そうすると、オブジェクトが自動的にキャストされますか?

4

4 に答える 4

2

ラップしていない場合は、データベース データを取得するコードをクラスにラップしてみてください。次に、特定のタイプのオブジェクトを返す 2 つのメソッドを追加します。

public class MyDataProvider
{
    bool isDataLoaded = false;

    public void LoadData(String sql, Hashtable data)
    {
        // Load data.
        isDataLoaded = true; // Or whatever mechanism you want to use to ensure data is loaded.
    }

    public IEnumerable<Student> GetStudents()
    {
        // Process student data if isDataLoaded.    
    }

    public IEnumerable<Teacher> GetTeachers()
    {
        // Process teacher data if isDataLoaded.
    }
}

そして、説明したようにリストを使用します。

MyDataProvider dp = new MyDataProvider("abc", data);

List<Student> students = new List<Student>();
students.AddRange(dp.GetStudents());

List<Teacher> teachers = new List<Teacher>();
teachers.AddRange(dp.GetTeachers());

もちろん、これは 1 つのアプローチにすぎませんが、あなたが説明したものよりも物事が少しきれいに保たれると思います。ジェネリックを使用することもできますが、生徒と教師に共通のインターフェイスを提供する必要があります。

于 2013-03-23T03:54:30.423 に答える
0

列挙型を使用してクラスを列挙し、このタイプの変数を関数に渡すことができます。しかし、すべてのリストをロードするための1つの関数を用意するのは良い考えではないと思います。ロードするクラスが多数あると、コードが乱雑になるからです。

于 2013-03-23T03:47:27.533 に答える
0

単純なORM (オブジェクト リレーショナル マッピング)コンポーネントを書きたいようです。自分で実装するのではなく、Microsoft の Entity FrameworkまたはNHibernateを調査します。これらは、必要に応じてシリアライゼーションをきめ細かく制御して、データベースからオブジェクトをロードおよび保存します。

ただし、あなたが抱えている問題に焦点を当てると、データの読み込みをオブジェクトごとに個別のクラス、つまりリポジトリ パターンに分割することをお勧めします。そうすれば、クラスが製品に追加または削除されても、単一のクラスに変更を集中させる必要はありません。リポジトリ クラスは、コードの重複を避けるために共通の基本クラスを共有する場合があります。

于 2013-03-23T03:57:50.160 に答える