这是一个分页的泛型方法签名:
IQueryable<T> GetModelsByPage<type>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, type>> OrderByLambda, Expression<Func<T, bool>> WhereLambda);
我UI层调用的时候
按道理来讲 应该是
GetModelsByPage<int>(....................);
为什么我这样写也是正确的?
StaffService.GetModelsByPage(1, 1, true,p=>p.Id, p => p.Age == 1);
最简单方式,你把GetModelsByPage<int>(....................); 这种写法放进vs2015,它会提示你<int>是多余的。
vs有能力根据你后面的参数类型推断出泛型方法的泛型参数类型,包括返回值。
IQueryable<T> GetModelsByPage<type>(int pageSize, int pageIndex, bool isAsc, Expression<Func<T, type>> OrderByLambda, Expression<Func<T, bool>> WhereLambda);
StaffService.GetModelsByPage(1, 1, true,p=>p.Id, p => p.Age == 1);
红色的参数能推导出T的类型,所以vs知道这个方法返回什么样类型集合IQueryable<T>
你的排序第二个参数(浅红色)类型是type型,是p.id,所以vs推断泛型参数为int类型。
可以推知排序可以根据bool型,string型等等进行排序,因为毕竟是泛型并且这里没有泛型约束,可以接受任何类型参数,
这个是不是还有一个StaffService:这个泛型类<Staff>这样???
是的
查了下msdn好像是编译器自己推断的。
@扶着往事走: 那不就是了吗?staffservice事实上就是一个泛型类,额,这么说也不太准确,他的T已经有了具体值,也不算泛型类了。。。
通过Expression<Func<T, type>> OrderByLambda这里的type可以推导出前面的type。
p=>p.Id 这里ID是int ,前面就是int
嗯,如果是无参的 编译器也就无法推断了,所以无参的必须要指定类型