带接口的列表中的通用列表

时间:2015-02-02 15:02:12

标签: c# list generics interface

我目前正在开发一项REST服务,它在我的CMS(Orchard)中创建页面和链接,这两者都需要放在我的菜单中。

这是我目前的解决方案:

public class ConfigurationDTO
{
    public ShellSettings Tenant { get; set; }
    public SetupContext SetupContext { get; set; }
    public IList<IList<Page>> Pages { get; set; }
    public IList<IList<Link>> Links { get; set; }

    public ConfigurationDTO() { }
}

我的Page.cs

public enum PageType
{
    HomePage,
    DownloadPage,
    StandardPage
}

public class Page
{
    public PageType Type { get; set; }
    public string MenuText { get; set; }
    public string Title { get; set; }
    public string Text { get; set; }
    public string Culture { get; set; }
    public bool Publish { get; set; }

    public Page() { }
}

Link.cs

public class Link
{
    public string Url { get; set; }
    public string MenuText { get; set; }
    public string Culture { get; set; }
}

我有两个包含其他列表的列表。内部列表包含本地化项目(同一内容项目的英语,德语和法语版本)。

我的大多数“元”代码对于链接和页面都是相同的,这就是我重构代码的原因。

这是我的重构尝试(不工作):

public interface IItem

public class Page : IItem

public class Link : IItem

我的新名单

public IList<IList<IItem>> Items{ get; set; }

我的目标是什么:

foreach (var item in config.Items)
        {
            foreach (var translation in item)
            {
                var page = translation as Page;
                if (page != null) doSomething();

                var link = translation as Link;
                if (link != null) doSomethingElse();
            }
        }

有没有办法从这个列表中获取特定的实现(这意味着如果它是一个页面,创建一个新的页面条目,反之亦然)?

编辑:我用相同的原理写了一个小样本程序并且它有效,这意味着我的问题就在其他地方。

你可以说这是我在stackoverflow上的第一篇文章,因为我刚刚告诉你什么不起作用而不是实际问题是什么。我的问题是我的主菜单中的顺序是错误的:

我想要的: 第1页第2页Link1 |第3页

我得到了什么: 第1页第2页第3页| LINK1

我的代码创建了所有页面,然后是链接并将它们添加到菜单中。解决方法 - &gt;每个项目都有订单属性。 我可能会在将来更改它,以便我只需要一个列表,但是现在我的解决方法就足够了。

无论如何,谢谢大家。

2 个答案:

答案 0 :(得分:2)

您可以使用SelectMany()将列表列表展平为单个列表,然后使用OfType<T>()以这种方式过滤特定类型:

var items = config.Items.SelectMany(x=>x);

var links = items.OfType<Link>();
var pages = items.OfType<Page>();

答案 1 :(得分:0)

您可以考虑使用Linq方法OfType将通用列表过滤到所需类型的列表子集:

var pages = config.Items.OfType<Page>();
var links = config.Items.OfType<Link>();

您可以阅读OfType here的文档。