是否有任何带有便利扩展方法的库可以将泛型与旧的.net库一起使用?

时间:2013-01-18 16:02:50

标签: c# .net winforms generics extension-methods

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

0 个答案:

没有答案