【问题标题】:Method to Return list with different type返回不同类型列表的方法
【发布时间】:2017-02-19 23:26:17
【问题描述】:

我正在尝试使用 MVC 5 进行搜索,我得到了逻辑,但我需要的是拥有返回 3 个不同列表对象的方法

我在 MVC 5 中有视图模型

public class SearchViewModel
{
    public List<Article> ArticleSearch { get; set; }
    public List<Albums> AlbumsSearch { get; set; }
    public List<Blog> BlogSearch { get; set; }
    public List<PDFModel> PDFSearch { get; set; }
}

在我的控制器中:

public ActionResult Index()
{
    using (DBContext db = new DBContext())
    {
        string xyz = "f";
        var Search = new SearchViewModel()
        {
            AlbumsSearch = helper.Search(db.Albums, xyz) <!-- Here i get error -->
        };
        return View(Search);
    }
}

helper.Search:

public static IList Search(object obj,string SearchString) 
{
    using (DBContext db = new DBContext())
    {
        if (obj is Albums)
        {

            var AlbumSearch = db.Albums.Where(x => x.AlbumName.Contains(SearchString) || 
            x.AlbbumSmallDesc.Contains(SearchString) || x.AlbumNameEnglish.Contains(SearchString)||
                    x.AlbbumSmallDescEnglish.Contains(SearchString)).ToList();

            return AlbumSearch as List<Albums>;
        }
        else if(obj is Article)
        {
            var ArticleSearch = db.Article.Where(x => x.ArticleSubject.Contains(SearchString)||x.ArticleSubjectEnglish.Contains(SearchString)||
                    x.ArticleMessage.Contains(SearchString)||x.ArticleMessageEnglish.Contains(SearchString)).ToList();
             return ArticleSearch;
        }
        else
        {
           return null;
        }
     }
 }

我想做一个返回列表的方法来进行搜索

我得到这个错误:

无法将类型“System.Collections.IList”隐式转换为“System.Collections.Generic.List”。存在显式转换(您是否缺少演员表?)

【问题讨论】:

  • 你很可能混合了泛型和非泛型集合
  • AlbumsSearch = helper.Search(db.Albums, xyz).ToList()
  • 我试过 `AlbumsSearch = helper.Search(db.Albums, xyz).ToList() 但我在智能感知中找不到 tolist 的乐趣
  • 如果你想要一个方法来操作各种类型的集合,你应该使用泛型。

标签: c# asp.net-mvc asp.net-mvc-5 viewmodel


【解决方案1】:

您可能应该为不同的类使用不同的搜索功能。话虽如此,您可以通过一些技巧来使用相同的搜索功能。定义一个扩展方法来将您的List&lt;T&gt; 转换为List&lt;object&gt;。然后从您的方法中返回一个List&lt;object&gt;

public static class ListExtensions
{
    public static List<Object> ToObjectList<T>(this List<T> list) where T : class
    {
        var objectList = new List<object>();
        list.ForEach(t => objectList.Add(t));
        return objectList;
    }
}

List<object> Search(int i)
    {
        if (i == 0)
        {
            return new List<Album>().ToObjectList();
        }
        else
        {
            return new List<Article>().ToObjectList();
        }          
    }

更新

然后,您可以在使用类似这样的扩展方法调用搜索时转换回来。

public static List<T> FromObjectList<T>(this List<object> list) where T : class
    {
        var result = new List<T>();
        list.ForEach(t => result.Add(t as T));
        return result;
    }

List<Album> albums = Search(0).FromObjectList<Album>();

【讨论】:

  • 这不起作用,因为在视图模型中,List&lt;object&gt; 将无法设置 List&lt;T&gt;
【解决方案2】:

消息很清楚,您正在尝试将IList 转换为IList&lt;T&gt;。您的方法返回前者,而您的视图模型返回后者。

您的搜索方法对您没有任何好处。您拥有所有这些 if 语句。如果你需要 30 种不同的类型,写 30 种不同的 if 语句,你会怎么做?而是这样做:

public static IList<Album> SearchAlbums(string SearchString)
{
    using (DBContext db = new DBContext())
    {

        var AlbumSearch = db.Albums.Where(x => x.AlbumName.Contains(SearchString) ||
        x.AlbbumSmallDesc.Contains(SearchString) || x.AlbumNameEnglish.Contains(SearchString) ||
                x.AlbbumSmallDescEnglish.Contains(SearchString)).ToList();

        return AlbumSearch;
    }
}

也为其他类型创建相同的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多