我能够在(Director class)
类的构造函数中传递一个对象Movie()
的实例,如
public Movie( string title, Director directorName ){
Title = title;
director=directorName;
}
Movie()
和Director()
之间存在一对一关系,这是完全可以理解的,因为每部电影只有一位导演,但如果一部电影有两位导演怎么办? (一对多)?你能告诉我如何在电影的构造中传递一份导演名单吗?以及如何在Console.WriteLine(m1.director.Name);
void Main()
{
Director d1 = new Director("Wachowski Brothers", "USA");
Movie m1 = new Movie("Matrix", d1);
Console.WriteLine(m1.Title);
Console.WriteLine(m1.director.Name);
}
class Movie
{
public Director director;
public string Title { get; set; }
public Movie( string title, Director directorName ){
Title = title;
director=directorName;
}
}
class Director
{
public string Name { get; set; }
public string Nationality { get; set; }
public Director(string name, string nationality){
Name = name;
Nationality = nationality;
}
}
更新
我在Movie()
构造函数
public Movie( string title, List<Director> directors ){
Title = title;
director= directors;
}
但我收到此错误
无法隐式转换类型 'system.collections.generic.list'来 'UserQuery.Director'
上
director= directors;
答案 0 :(得分:1)
C#是一种强类型语言。这意味着您无法自由地将类中的类型替换为彼此。
这意味着,对于像电影这样的实体,你可能有多个导演,你需要使用集合类型并以其他方式解决这个问题。
这里有两件事要回答:
a)为了获得一部电影的两个(或更多)导演,你需要将它们存储在某种类型的集合中。为此目的,我建议使用通用列表。
class Movie
{
public List<Director> Directors { get; set; }
public Movie(List<Director> directors)
{
Directors = directors;
}
}
(这里要读的内容:C#中的泛型 - 单个列表如何包含各种内容)
b)为了能够在一个字段中获取导演的姓名,您需要在电影中引入属性。毕竟,导演只有一个名字,但一部电影可能有几个导演。
class Movie
{
public string DirectorNames
{
get
{
return Directors.Aggregate("", (result, director) => string.Concat(result, result.Length>0?", ":"", director.Name);
}
}
}
(这里要读的内容:lambda函数 - what =&gt;代码中的含义)
上面的代码会将列表中的控制器的名称输出为字符串,如果有多个导演,则用逗号分隔每个导演。
之后,您将使用Console.WriteLine(m1.DirectorNames)而不是Console.WriteLine(m1.director.Name);