【问题标题】:IEnumerable<> returns nullIEnumerable<> 返回 null
【发布时间】:2012-08-10 20:39:26
【问题描述】:

我在我的代码中返回一个空值:(var cat 行)

public class CategoryItemsViewModel
{
    public ICategoriesRepository categoriesRepository;

    public IEnumerable<Categories> GetCategories()
    {
        var cat = categoriesRepository.Categories;

        return cat;

    }
}

界面如下:

namespace SportsStore.Domain.Abstract
{
    public interface ICategoriesRepository
    {
        IQueryable<Categories> Categories { get; }
        void SaveCategory(Categories category);
        void DeleteCategory(Categories category);
    }
}

这里是类:

namespace SportsStore.Domain.Entities
{
    public class Categories
    {
        [Key]
        public int CategoryID { get; set; }
        public string CategoryName { get; set; }
    }

}

我做错了什么?

【问题讨论】:

  • 它是空的...您是否已经尝试过一些基本的调试?你知道:Visual Studio 附带了一个出色的调试器!
  • 您是否能够执行其他 CRUD 操作,例如添加新类别?
  • 嗯,有无数的事情可能是错误的。 Categories 属性到底在做什么?这可能是您问题的核心部分。
  • categoriesRepository 成员是如何初始化的?

标签: c# asp.net asp.net-mvc model ienumerable


【解决方案1】:

到目前为止,您所拥有的一切都很好 - 只是不完整。

您也不需要其他人建议的二传手——事实上,在这种情况下,最好不要二传手。

您确实需要接口 ICategoriesRepository 的具体实现,例如:

public class CategoriesRepository : ICategoriesRepository
{
    private readonly ModelContainer db= new ModelContainer();

    public IQueryable<Categories> Categories 
    { 
        get
        {
            return this.db.Categories;
        }
    }

    public void SaveCategory(Categories category)
    {
        // TODO
    }

    public void DeleteCategory(Categories category)
    {
        // TODO
    }
}

然后您需要在视图模型中添加一行:

public class CategoryItemsViewModel
{
    public ICategoriesRepository categoriesRepository;

    public IEnumerable<Categories> GetCategories()
    {
        // This is to instantiate your repository.  It may be a better idea to do this
        // when it is declared, above.
        categoriesRepository = new CategoriesRepository();

        var cat = categoriesRepository.Categories;

        return cat;

    }
}

【讨论】:

    【解决方案2】:

    您没有在ICategoriesRepository 对象中为Categories 属性设置任何不是null 的内容,并且您不能使用给定的接口。您有一个带有自动 getter 和 no setter 的属性。这意味着它只能返回null。如果有一个设置器(公共的或私有的),那么您将 能够 将其设置为其他东西。 (您还需要有一行代码来实际执行此操作。)您还可以使用自定义 getter,它实际上返回的内容不仅仅是支持字段。 (这对于派生数据很常见。)

    【讨论】:

    • 没有 setter 并不意味着它总是返回 null,在这种情况下可能不需要 setter。只需直接从模型容器中返回类别(请参阅我的答案)。
    • @PeteOakey 我说你需要一个 setter 或一个非自动 getter。您选择提供后者的实现。通过使用自定义 getter,您可以返回一些可以修改的其他内容。具有自动 getter 且没有其他任何内容的属性只会返回该类型的默认值。
    • 所以你做到了 - 嗯,在对问题进行编辑之前无法撤消我的否决票。我尝试自己编辑,但没有成功。
    • @Pete:由于你的声望低于 2000,所以必须由其他用户审核。它 在等待审核的队列中,但由于“太次要”而被拒绝。
    • @PeteOakey 我对帖子进行了编辑,但没有改变其含义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-26
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多