C# 传递实现同一接口的不同内容

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; } }

我有多个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
列表,然后使用我在项目中的每个分部类中实现的那些公共属性

所以,我想澄清一下

文章
是一个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,那么只需使用Linq
Cast()

IEnumerable articles=myContext.GetArticles().Cast();

所以。。。如果我将一个
IEnumerable
传递给一个
IEnumerable
它会工作吗?我使用的是.NET3.5,所以我猜我被束缚住了。我想知道什么是好的解决方案。是的,4.0也可以。使用3.5,您可以使用
Cast()
LINQ扩展方法。我认为您是第一个声明需要
Cast
IEnumerable<IContent> articles = myContext.GetArticles().Cast<IContent>();