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