我有以下型号:
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]'。
如果有人能帮我看看我做错了什么,我会很感激。感谢
答案 0 :(得分:2)
如果使IAntiSpamClass<T>
接口与其类型参数协变,则如下所示:
public interface IAntiSpamSubclass<out T> where T : IAntiSpam {
T Entity { get; }
}
然后这个演员会工作。请注意以下更改:
out
修饰符。 进一步阅读