我有一堂课电影:
internal class Movie
{
public string Name { get; set; }
public string Year { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我有这个代码:
var Movies = CreateMovies(); //IEnumerable<Movie>
var sorter = new Sorter<Movie>();
sorter.AddSort(Movies, m => m.Year , a=>a.Name ,.....as many as I want....);
Run Code Online (Sandbox Code Playgroud)
这是Sorter班级:
class Sorter<T>
{
public void AddSort(IEnumerable<T> movs, params Expression<Func<T, object>>[] funcs)
{
/*...*/
movs.OrderBy(d=>d.); //<----- here is the problem : where is the columns ?
}
}
Run Code Online (Sandbox Code Playgroud)
题 :
当我需要智慧时d,它告诉我:

我不明白为什么T不推断为Movie:
看看有多少位置推断T是Movie:

如何在不更改的情况下Ienumerable<Movies>使这些电影字段显示?
在编译Sorter类时,编译器不知道它将是什么类型,因此无法判断将使用它的用户是否具有Year属性.
但是,你可以使用where约束:
class Sorter<T> where T: Movie
Run Code Online (Sandbox Code Playgroud)
这样编译器知道给定的类T将具有Year属性以及其他属性
在泛型类型定义中,where子句用于指定可用作泛型声明中定义的类型参数的参数的类型的约束.例如,您可以声明泛型类MyGenericClass,以便类型参数T实现IComparable接口:
所以它说你甚至不必这么做
class Sorter<T> where T: Movie
Run Code Online (Sandbox Code Playgroud)
我们可以满意
class Sorter<T> where T: ImyInterface
Run Code Online (Sandbox Code Playgroud)
和ImyInterface将包含的特性Name和Year.