public static IList<IT> ToList<T, IT>(this DataSet dataSet) where T : IT, IMapping, new()
        {
            if (NullManager.DataSetIsNull(dataSet))
            {
                return new List<IT>();
            }            IList<IT> list = new List<IT>();
            for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
            {
                T t = new T();
                t.MappingFromDataRow(dataSet.Tables[0].Rows[i]);                list.Add(t);
            }            return list;
        }为什么这个方法名是这样的:
public static IList<IT> ToList<T, IT>(this DataSet dataSet) where T : IT, IMapping, new()我就看懂范型了。
一,请问(this DataSet dataSet)
为什么参数里要加this呀。二,请问那个where T : IT是啥东西三,请问IMapping是啥东西四,请问new()是啥东西十分感谢

解决方案 »

  1.   

    类型参数 T 实现 IT, IMapping, new()接口
    new创建类型参数实例
      

  2.   

    第一个问题:
    在方法的第一个参数前面多了一个this关键字叫扩展方法:
    1 方法所在的类必须是静态的
    2 方法也必须是静态的
    3 方法的第一个参数必须是你要扩展的那个类型,比如你要给int扩展一个方法,那么第一个参数就必须是int。
    4 在第一个参数前面还需要有一个this关键字。
      

  3.   

    参数类型实现 new() 接口?写错了.
      

  4.   

    其实,既然程序中必须 new T(),那么没有必要再涉及 IT。         public static List<T> ToList<T>(this DataSet dataSet) where T : IMapping, new()
            {
                if (NullManager.DataSetIsNull(dataSet))
                {
                    return new List<T>();
                }            List<T> list = new List<T>();
                for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
                {
                    T t = new T();
                    t.MappingFromDataRow(dataSet.Tables[0].Rows[i]);                list.Add(t);
                }            return list;
            }泛型、扩展方法,都是让程序变得很精练的好方法。你没有看懂,可能是用的少的缘故。“看懂泛型了”不一定代表你看懂了泛型,会用之后才能说看懂了(一本小说你每一个字都认识但是看不懂完整的故事又有什么用)。1. 对于扩展方法,将来所有的DataSet就天然地增加了一个ToList方法,就好像.net framework类库中天然地有这个方法一样。调用时可以写:    DataSet ds;
       ......
       IList<MyClass> result=ds.ToList<MyClass>();2. IT似乎多余,增加复杂性。3. 定义了 MappingFromDataRow 接口方法。编译器会自动检验调用时的类型参数有没有 IMapping 接口,也就是有没有实现 MappingFromDataRow 方法(类型必须实现接口中的所有方法)。4. 类似于3,编译器要检验调用时的类型参数有没有默认的实例化(.ctor)方法。因为代码中要 new T() 嘛。c#是编译时强类型的语言,如果编译器无法推断出 T 具有实例化方法,就无法编译通过。
      

  5.   

    谢谢,sp。好像模模糊糊看明白一些,主要是以前没用过。这个没有涉及到LINQ的东西吧
      

  6.   

    http://weblogs.asp.net/scottgu/archive/2007/03/13/new-orcas-language-feature-extension-methods.aspx硬着头皮看完这个,很好很强大
      

  7.   

    好东西啊,
    谢谢楼主提问,谢谢sp回答,谢谢cctv,谢谢mtv
    呵呵
      

  8.   

    其实就是3.0中的所谓 “扩展方法”
    只是和泛型连在一起使用,很容易让人误解。
    下面对 int 的扩展就清晰多了public static int ANewMethodOfInt(this int i){
      return i++;
    }顺便说下,sp1234的回答更是让人一头雾水
    难道技术好的人语言也变得晦涩?