我目前正在开发一项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;每个项目都有订单属性。 我可能会在将来更改它,以便我只需要一个列表,但是现在我的解决方法就足够了。
无论如何,谢谢大家。
答案 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的文档。