在为 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)
{
}