5

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

0 回答 0