C# 传递实现同一接口的不同内容
我有多个Linq2Sql类,例如“Article”“NewsItem”“Product” 他们都有一个标题,他们都有一个唯一的ID,他们都有一个摘要 因此,我创建了一个名为C# 传递实现同一接口的不同内容,c#,linq-to-sql,interface,polymorphism,covariance,C#,Linq To Sql,Interface,Polymorphism,Covariance,我有多个Linq2Sql类,例如“Article”“NewsItem”“Product” 他们都有一个标题,他们都有一个唯一的ID,他们都有一个摘要 因此,我创建了一个名为IContent public interface IContent { int Id { get; set; } String Title { get; set; } String Summary { get; set; } String HyperLink { get; set; } }
IContent
public interface IContent {
int Id { get; set; }
String Title { get; set; }
String Summary { get; set; }
String HyperLink { get; set; }
}
在我的代码中,我试图传递一个实现IContent
的列表,然后使用我在项目中的每个分部类中实现的那些公共属性
所以,我想澄清一下
文章
是一个Linq实体。
我创建了一个分部类并实现了IContent
下面是Article.cs的一个片段:
#region IContent Members
public int Id {
get {
return this.ArticleID;
}
set {
this.ArticleID = value;
}
}
很简单。在我的代码中,我试图解决这个问题,但我不知道哪里出了问题:
List<IContent> items;
MyDataContext cms = new MyDataContext();
items = cms.GetArticles();
// ERROR: Can not implicitly convert List<Article> to List<IContent>
列表项;
MyDataContext cms=新的MyDataContext();
items=cms.GetArticles();
//错误:无法将列表隐式转换为列表
如果我的文章
类实现I内容
为什么我不能传递文章?我不知道将要传入的对象是什么
我知道我可以通过继承基类来做到这一点,但是使用LinqToSQL不使用常规对象
我确信我遗漏了一些简单的东西。这是因为列表类和接口不是协变的。如果您使用的是.NET 4.0和C#4.0,那么实际上可以在IEnumerable
接口上使用协方差,这对于LINQ应用程序应该是可以的
你试过了吗
items = cms.GetArticles().Cast<IContent>().ToList();
items=cms.GetArticles().Cast().ToList();
这是一个经典案例,要求在C#4.0中使用协方差。您只需将List
更改为IEnumerable
,即可使此分配生效:
IEnumerable<IContent> articles = myContext.GetArticles();
IEnumerable articles=myContext.GetArticles();
如果您一直使用.NET 3.5,那么只需使用LinqCast()
:
IEnumerable articles=myContext.GetArticles().Cast();
所以。。。如果我将一个IEnumerable
传递给一个IEnumerable
它会工作吗?我使用的是.NET3.5,所以我猜我被束缚住了。我想知道什么是好的解决方案。是的,4.0也可以。使用3.5,您可以使用Cast()
LINQ扩展方法。我认为您是第一个声明需要Cast
IEnumerable<IContent> articles = myContext.GetArticles().Cast<IContent>();