Winforms のコードを作成するときは、すべてをキャストして汎用 IEnumerable を取得する必要があります。
resultsListView
.SelectedIndices
.Cast<int>()
.ToArray();
treeView1.Nodes.Cast<TreeView>().Where...
var items = listView1.Items.Cast<ListView>();
さて、上記のようなタイプミスをしたとしても、コードが実行されるまで気付かないでしょう。(つまり、動的に型付けされます。)
これを回避するために、次のようなユーティリティ拡張メソッドをいくつか作成しました。
resultsListView
.SelectedIndices
.AsEnumerable()
.ToArray();
treeView1.Nodes.AsEnumerable().Where...
var items = listView1.Items.AsEnumerable();
拡張方法の例:
public static IEnumerable<TreeNode> AsEnumerable(this TreeNodeCollection source)
{
return source.Cast<TreeNode>();
}
さて、あちこちにメソッドを書きました.NETライブラリにはかなりの数のクラスがあります. それでどうですか?
古い .net ライブラリでジェネリックを使用するための便利な拡張メソッドを備えたライブラリはありますか?
編集:
実際には、クラスがすでに (しばしば) 提供している静的型付けを利用するために、これが私が実際に書いた方法です:
public static IEnumerable<TreeNode> AsEnumerable(this TreeNodeCollection source)
{
AssertTypesMatch(source, (s) => s.AsEnumerable(), (s) => s[0]);
return source.Cast<TreeNode>();
}
public static IEnumerable<ListViewItem> AsEnumerable(this ListView.ListViewItemCollection source)
{
AssertTypesMatch(source, (s) => s.AsEnumerable(), (s) => s[0]);
return source.Cast<ListViewItem>();
}
[System.Diagnostics.Conditional("ALWAYZ__EXKLUDE_ME_")]
private static void AssertTypesMatch<TSource, TItem>(TSource t1, Func<TSource, IEnumerable<TItem>> f2, Func<TSource, TItem> f1)
{
}