1

大規模な WPF アプリケーションで発生した問題のサンプル アプリケーションを用意しました。

私が抱えている問題は、TreeColumn インスタンスの 2 番目のタイプobsTreeColumnCollection. ご覧のとおり、1 つのタイプだけでこれを行うと、アップキャストは正常に機能します。このメソッドDoSomethingWithColumnは、パラメーターの 2 番目のジェネリック型として、任意の型のコレクションを処理できる必要がありますcollection

public class TreeColumn<T, TValue>  where TValue : Collection<T> {
    // A lot happens in here...
}

public class Data {
    public int Id { get; set; }
    public int Code { get; set; }
    // And much more...
}

class Program {
    static void Main(string[] args) {
        var expander = new TreeExpander<Data>();
        var obsTreeColumn = new TreeColumn<Data, ObservableCollection<Data>>();
        var colTreeColumn = new TreeColumn<Data, Collection<Data>>();

        var obsCollection = new ObservableCollection<Data>();
        var colCollection = new Collection<Data>();

        expander.DoSomethingWithColumn(obsTreeColumn);
        expander.DoSomethingWithColumn(colTreeColumn);
        expander.DoSomethingWithCollection(obsCollection);
        expander.DoSomethingWithCollection(colCollection);
        Console.ReadKey();
    }
}

class TreeExpander<T> where T : class {

    private int _rowCounter;

    public void DoSomethingWithColumn(object column) {

        // WHY ISN'T THIS CAST WORKING WITH A TreeColumn<T, ObservableCollection<T>>????
        var cast2 = column as TreeColumn<T, Collection<T>>;
        WriteLine("Cast to 'TreeColumn<T, Collection<T>>': ");
        WasCastSuccess(cast2);

        WriteLine("");
    }

    public void DoSomethingWithCollection(object collection) {

        var cast2 = collection as Collection<T>;
        WriteLine("Cast to 'Collection<T>': ");
        WasCastSuccess(cast2);

        WriteLine("");
    }

    private void WasCastSuccess(object o) {
        WriteLine(o != null ? "PERFECT!" : "Cast didn't work :(");
    }

    private void WriteLine(string msg) {
        _rowCounter++;
        Console.WriteLine(_rowCounter.ToString("00")+": "+msg);
    }
}

コンソール出力は次のとおりです。

01: Cast to 'TreeColumn<T, Collection<T>>':
02: Cast didn't work :(
03:
04: Cast to 'TreeColumn<T, Collection<T>>':
05: PERFECT!
06:
07: Cast to 'Collection<T>':
08: PERFECT!
09:
10: Cast to 'Collection<T>':
11: PERFECT!
12:

出力の 2 行目が PERFECT! と表示されるようにする必要があります。

4

1 に答える 1