关于B类建设者中A类通过名单的问题

时间:2017-09-24 09:31:18

标签: c#

我能够在(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;

1 个答案:

答案 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);