【问题标题】:Generic method in a non-generic class?非泛型类中的泛型方法?
【发布时间】:2009-01-08 08:45:22
【问题描述】:

我确定我以前做过,但找不到任何例子!呜呜呜……

例如,我想将IList<T> 转换为BindingList<T>

public class ListHelper
{
    public static BindingList<T> ToBindingList(IList<T> data)
    {
        BindingList<T> output = new BindingList<T>();

        foreach (T item in data)
            output.Add(item);

        return output;
    }
}

【问题讨论】:

  • 这里的实际问题是什么?是的,泛型方法在非泛型类中很好(System.Linq.Enumerable 可能是最大的例子)。
  • @Jon - 他错过了 ToBindingList 中的

标签: c# generics


【解决方案1】:
ToBindingList <T> (...)

public class ListHelper
{
    public static BindingList<T> ToBindingList<T>(IList<T> data)
    {
        BindingList<T> output = new BindingList<T>();

        foreach (T item in data)
        {
            output.Add(item);
        }

        return output;
    }
}

【讨论】:

    【解决方案2】:

    这不是更简单吗?

    public static class Extensions
    {
        public static BindingList<T> ToBindingList<T>(this IList<T> list)
        {
            return new BindingList<T>(list);
        }
    }
    

    非常简单,我们不需要扩展方法...

    我错过了什么吗?

    【讨论】:

    • 为什么允许你这样做? BindingList 中是否有一个以数组为参数并从中生成 BindingList 的构造函数?
    • @Imray 它不是一个数组,它是一个IList,并且有一个构造函数接受它作为参数:referencesource.microsoft.com/#System/compmod/system/… 第 65 行
    【解决方案3】:

    你可以通过扩展方法做到这一点,这样会更好。

    public static class Extensions
    {
        public static BindingList<T> ToBindingList<T>(this IList<T> list) 
        {
            BindingList<T> bindingList = new BindingList<T>();
    
            foreach (var item in list)
            {
                bindingList.Add(item);
            }
    
            return bindingList;
        }
    }
    

    【讨论】:

    • 我就是这样做的......甚至可能来自 IEnumerable (因为你所做的只是 foreach)
    • 是的,IEnumerable 会更好。
    猜你喜欢
    • 1970-01-01
    • 2015-07-30
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2017-11-13
    • 2012-03-01
    相关资源
    最近更新 更多