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

时间:2016-08-02 16:56:51

标签: c# .net

这个最可能的简单问题我遇到了很多麻烦。 我有一个具有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'。我理解,但我仍然需要这种方法是静态的。 我希望有人可以帮助我完成我的项目:)

提前致谢!

2 个答案:

答案 0 :(得分:1)

您需要存储已创建的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);
}

要创建Movie实例,您可以在创建时或在Movie构造函数上将其添加到movies列表。

答案 1 :(得分:0)

嗯,从逻辑上讲,this成员中static会引用什么?考虑一下你如何调用这个成员:

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);
    }
}

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