gpt4 book ai didi

c# - 使用接口(interface)问题的继承转换

转载 作者:行者123 更新时间:2023-11-30 17:01:59 24 4
gpt4 key购买 nike

我有以下模型:

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

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

Unable to cast object of type 'CommentReported' to type 'IAntiSpamSubclass`1[IAntiSpam]'.

如果有人能帮助我指出我做错了什么,我将不胜感激。谢谢

最佳答案

如果IAntiSpamClass<T>接口(interface)与它的类型参数是协变的,像这样:

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

那么这个 Actor 就可以了。请注意这些变化:

  • 添加了 out 类型参数的修饰符。
  • 删除了属性 setter 。

延伸阅读

关于c# - 使用接口(interface)问题的继承转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20426325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com