C#-如何编写一个返回Movie对象的静态函数

本文关键字:Movie 返回 对象 静态函数 一个 何编写 C#- | 更新日期: 2023-09-27 18:00:04

这个很可能很简单的问题我遇到了很多麻烦。我有一个电影类,它有一个name属性。我想创建一个静态函数,返回具有该名称的电影实例。

这是我迄今为止的代码:

public static Movie getMovieByName(string name)
{
    if(this.name == name)
    {
        return this;
    }
    else
    {
        throw new InvalidMovieException(name);
    }
}
class InvalidMovieException : System.Exception
{
    public InvalidMovieException(string value) : base(String.Format("This movie doesn't exist! Value: {0}", value)) { }
}

我遇到一个错误,无法在静态方法中使用关键字"this"。我理解这一点,但我仍然需要这种方法保持静态。我希望有人能帮助我的项目:)

提前感谢!

C#-如何编写一个返回Movie对象的静态函数

您需要存储创建的Movie实例,然后对它们进行迭代。你可以这样做:

public static List movies;
public static Movie getMovieByName(string name)
{
    foreach(Movie m in movies)
    {
        if(m.name == name)
            return m;
    }
    throw new InvalidMovieException(name);
}

若要创建"影片"实例,可以在创建时或在"影片"构造函数中将其添加到movies列表中。

从逻辑上讲,thisstatic成员中指的是什么?考虑如何调用此成员:

Movie.getMovieByName("Highlander")

this会是什么?您不是在Movie实例的上下文中操作的,因此没有this

那么,你实际上在试图返回什么呢?如果要将字符串值与Movie对象的名称进行比较,则需要获取Movie对象的名称。

举个例子,假设您在某个地方有一些Movie的数据库存储库。你可能有这样的结构:

public static Movie getMovieByName(string name)
{
    var movie = MovieRepository.Movies.SingleOrDefault(m => m.name == name);
    if(movie != null)
    {
        return movie;
    }
    else
    {
        throw new InvalidMovieException(name);
    }
}

基本上,你会从电影列表中找到这部电影。目前,在你的方法中,你没有什么可以比较的,你只有传递给该方法的字符串。