传递实现相同界面的不同内容

时间:2010-09-01 21:59:50

标签: 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; }
}

在我的代码中,我试图传递一个实现List<T>的{​​{1}},然后使用我在项目中每个部分类中实现的公共属性。

所以,只是为了澄清

IContent是Linq实体。 我创建了一个部分类并实现了Article这里是Article.cs的片段:

IContent

非常简单。在我的代码中,我正在尝试这个,但我不知道我哪里出错:

   #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> 类实现Article,为什么我不能传入文章?我不知道将要传递的对象是什么。

我知道我可以通过继承基类来实现这一点,但是使用LinqToSQL不会使用常规对象。

我确信这很简单,我很想念。

3 个答案:

答案 0 :(得分:7)

这是因为List类和接口不是协变的。如果你使用的是.NET 4.0和C#4.0,你实际上可以在IEnumerable<>接口上使用协方差,这对LINQ应用程序来说应该没问题。

There's a good FAQ covering those topics.

答案 1 :(得分:1)

你试过吗

items = cms.GetArticles().Cast<IContent>().ToList();  

答案 2 :(得分:1)

这是在C#4.0中要求协方差的经典案例。您只需将List<Article>更改为IEnumerable<Article>即可使此工作正常工作:

IEnumerable<IContent> articles = myContext.GetArticles();

如果你坚持使用.NET 3.5,你可以使用Linq Cast<T>()

IEnumerable<IContent> articles = myContext.GetArticles().Cast<IContent>();