C# Generics - 根据对象类型找到正确的具体类

标签 c# generics reflection inheritance interface

我的领域模型有几个 NewsType,它们是 NewsItem 的子类,如下所示(简化):

public abstract class NewsItem : Entity
{
    public virtual Account Account { get; set; }
    public virtual DateTime DateTime { get; set; }
}

这里有几个 NewsItem 的子类:

public class NewsItemJoiner : NewsItem
{
    public virtual Account AccountJoined { get; set; }
}

public class NewsItemStatus : NewsItem
{
    public virtual string Status { get; set; }
}

在我的 MVC 应用程序中,我想返回 Newsitem 的集合,其中可能包含 NewsItem 的许多不同子类。我现在需要做的是遍历每个新闻项目,并从相关类中为特定类型的 NewsItem 调用渲染函数...代码可能会更容易解释它:

public interface IRenderer<T> where T : NewsItem
{
    string Render(T item);
}

public class JoinedRenderer : IRenderer<NewsItemJoiner>
{
    public string Render(NewsItemJoiner item)
    {
        return String.Format("{0} has just joined our music network.", item.AccountJoined.ArtistName);
    }
}

public class StatusUpdateRenderer : IRenderer<NewsItemStatus>
{
    public string Render(NewsItemStatus item)
    {
        return String.Format("<span class='statusupdate'>{0}<span>", item.Status);
    }
}

我需要根据 NewsItem 的类型以某种方式调用正确的类渲染函数。

最佳答案

对于虚函数来说,这似乎是一个相当明显的例子......

public abstract class RenderableNewsItem : NewsItem
{
    abstract public string Render();
}

public class NewsItemStatus : RenderableNewsItem 
{ 
    public virtual string Status { get; set; } 
    public string Render() 
    { 
        return String.Format("<span class='statusupdate'>{0}<span>", this.Status); 
    } 
}

关于C# Generics - 根据对象类型找到正确的具体类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2274697/

相关文章:

c# - 如何绑定(bind)我的 ListView 组合框的选定项目

java - 获取参数化类 T extends Enum<?> 的实际枚举类

android - 我是否需要 root 权限才能访问内部类?

c# - ListView 对象引用未设置为对象的实例

c# - 如何修复 Automapper 将连接表映射到 ViewModel

c# - 相同分辨率下不同电脑上的字体大小不同

c# - C# .NET 中的重载方法

java - 一个 Iterable<? extends String> 曾经包含过字符串以外的任何东西吗?

c# - 有没有一种方法可以用 Moq 来模拟 DbSet.Find 方法?

Java:为什么这里没有自动装箱?