使用接口问题继承强制转换

时间:2013-12-06 14:28:27

标签: c# inheritance interface

我有以下型号:

public interface IAntiSpam {
    string Name { get; }
    string Text { get; }
}

public interface IAntiSpamSubclass<T> where T : IAntiSpam {
    T Entity { get; set; }
}

public class Comment : IAntiSpam {
    public string Name { get; set; }
    public string Text { get; set; }
}

public class ForumPost : IAntiSpam {
    public User User { get; set; }
    public string Text { get; set; }
    public string Name { get return User.Name; }
}

public class ReportedData {        
    public string Reason { get; set; }
    public User ReportedBy { get; set; }
    public DateTime DateReported { get; set; }
}

public class CommentReported : ReportedData, IAntiSpamSubclass<Comment> {        
    public Comment Entity { get; set; }
}

public class ForumPostReported : ReportedData, IAntiSpamSubclass<ForumPost> {        
    public ForumPost Entity { get; set; }
}

这个编译我作为一个标志,我正走在正确的道路上。

现在给出一个ReportedData列表我需要循环数据并根据报告的数据显示Text属性。我可以将ReportedData转换为适当的类型,然后从那里访问它。但是我不希望这样做,因为我需要能够添加从ReportedData继承的其他类型,而不必修改显示Text属性的代码。这是我认为我的界面会有所帮助的地方。

这是我试图运行的代码:

var reportedData = GetReportedData(); // Returns IList<ReportedData>()

foreach (var data in reportedData) {
    var text = ((IAntiSpamSubclass<IAntiSpam>)data).Entity.Text;
}

但是,这会在运行时出现以下错误:

  

无法将“CommentReported”类型的对象强制转换为类型   'IAntiSpamSubclass`1 [IAntiSpam]'。

如果有人能帮我看看我做错了什么,我会很感激。感谢

1 个答案:

答案 0 :(得分:2)

如果使IAntiSpamClass<T>接口与其类型参数协变,则如下所示:

public interface IAntiSpamSubclass<out T> where T : IAntiSpam {
    T Entity { get; }
}

然后这个演员会工作。请注意以下更改:

  • 在type参数上添加了out修饰符。
  • 删除了属性设置器。

进一步阅读