1

同様のタスクを実行しようとしている多くの投稿を読みましたが、問題の適切な解決策を見つけることができません。

実行時にオブジェクトを動的にキャストしようとしています。(多くの人がそれができないと言うことを知っています、そしてそれができるかどうかは実際にはわかりません...)私の問題はTreeViewWindows Forms Applicationを表示するために動的に作成されていることOrg Chartです。

TreeView3つのテーブルからのプルのデータ: Departments、、。JobsEmployees

Tablesasをインポートすると、 Local DataSource3つのテーブルすべてがオブジェクトとして取得され、オブジェクトタイプDataSetのテンプレートがDataRow元のテーブルにキャストされます(プロパティとしてのすべての列を含む)。(linqと同様-Oracle DBを除く)

オブジェクトを作成TreeNodeし、自分の説明フィールドをプロパティDataRowとして使用してから、それ自体をプロパティとしてTreeNode.Textアタッチします。このように、キャストするだけで直接データにアクセスできます。DataRowTreeNode.TagTreeNode

dsMyDataSource.DepartmentRow = 
    (dsMyDataSource.DepartmentRow)treeview1.SelectedNode.Tag;

基になるオブジェクトデータの一部をウィンドウに表示するNodeontreeview1をユーザーが選択するたびに実行されるメソッドがあります。Details現在のところ、switchステートメントを含む単一のメソッドがあります。

private doSomething()
{
    switch(treeview1.SelectedNode.Tag.GetType().Name)
    {
        case "dsMyDataSource.DepartmentRow":
            dsMyDataSource.DepartmentRow department = 
                (dsMyDataSource.DepartmentRow)treeview1.SelectedNode.Tag;
            lblDetailsTitle = department.Title;
            break;
        case "dsMyDataSource.JobRow":
            //etc...
    }
}

私がやりたいのは、タイプごとにオーバーロードされたメソッドを用意し、switchステートメントを削除することです。そのようです:

this.doSomething(treeview1.SelectedNode.Tag);

問題は、これがベースオブジェクト(つまりキャスト)を返すことです。しかし、コンパイル時に、ユーザーがどのタイプのTreeNodeを選択するかはわかりません。したがって、私は次のようなことができるようにしたいと思います。

this.doSomething((treeview1.SelectedNode.Tag.GetType())treeview1.SelectedNode.Tag);

private void doSomething(dsMyDataSource.DepartmentRow department)
{
    lblDetailsTitle = department.Title;
    // etc...
}

private void doSomething(dsMyDataSource.JobRow job) {..}

private void doSomething(dsMyDataSource.EmployeeRow employee) {..}

これは可能ですか?

4

1 に答える 1

1

DataRows から直接作業するのではなく、いくつかの意味のあるオブジェクトを使用すると、物事がよりきれいになることがあります。さらに、これにより基本クラスを追加できるようになり、キャストの問題が解消されます。

たとえば、

abstract class Selectable
{
    public string Type { get; private set; }

    public Selectable(string type) { Type = type; }

    abstract void doSomething();
}

次に、選択したいものごとのタイプ

class Department : Selectable{...}, class Job : Selectable{...}

基本型を取得するには、ファクトリ オブジェクトに 1 つのスイッチが必要です。

public static class SelectableFactory
{
    public static Selectable GetFromDataRow(DataRow dr)
    {
        Selectable res = null;
        switch (dr.Type)
        {
            case "Department":
                res = new Department(dr);
                // etc ...
            }
    }
}

しかし、これで、ポリモーフィズムを使用してアクションを実行できる Selectable のコレクションができました。

あなたの生活を楽にするだけでなく、将来そのコードに取り組まなければならない人のために、あなたのコードを解析しやすくします。また、拡張可能であるため、DoSomethingElse メソッドを追加する必要がある場合でも、すべてに簡単に追加できます。また、新しいタイプのデータテーブルが必要な場合でも、UI コードを邪魔する必要はありません。

于 2013-02-05T21:10:05.123 に答える