0

我遇到过一种情况,答案应该非常直截了当,但它让我望而却步。

public class Note
{

    #region Properties

    public int Id { get; set; }
    public int ClientId { get; set; }
    public int CandidateId { get; set; }
    public int TypeId { get; set; }
    public DateTime DateCreated { get; set; }
    public string UserId { get; set; }
    public string UserName { get; set; }
    public string Message { get; set; }

    #endregion

    #region Methods

    public void Save()
    {

    }

    #endregion

}

public class History : Note
{
}

如您所见,History 继承了 Note。它们完全相同,两者之间的唯一区别是类型 Id。

从数据库获取数据时我有这个功能

    public static Note Parse(SqlDataReader dr)
    {
        int TypeId = Convert.ToInt32(dr["TypeId"]);
        Note Note;

        if (TypeId == 1)
            Note = new Note();
        else
            Note = new History();

        Note.Id = Convert.ToInt32(dr["Id"]);
        Note.TypeId = TypeId;
        if (dr["ClientId"] != DBNull.Value) Note.ClientId = Convert.ToInt32(dr["ClientId"]);
        if (dr["CandidateId"] != DBNull.Value) Note.CandidateId = Convert.ToInt32(dr["CandidateId"]);
        Note.DateCreated = Convert.ToDateTime(dr["DateCreated"]);

        Note.UserId = Convert.ToString(dr["UserId"]);
        Note.UserName = Convert.ToString(dr["UserName"]);
        Note.Message = Convert.ToString(dr["Message"]);

        return Note;
    }

然后在我的 MVC 页面上我有这个:

<ol id="interview-comments">                                
@foreach (Note Note in Model.Notes().OfType<Note>())
{  
}
</ol>

<ol id="history-comments">                             
@foreach (History Note in Model.Notes().OfType<History>())
{  
}
</ol>

我的问题很简单。这是正确的方法吗?

/r3plica

4

3 回答 3

0

我可能没有完整的图片,但我会考虑只使用一个类 - Note。而是在该类上有一个属性 - IsHistoric。然后根据属性而不是类型进行检查。

于 2012-12-30T15:54:16.593 回答
0

由于 aHistory是 a Note,您Model.Notes().OfType<Note>()还将包括History实例 - 这是故意的吗?

您可能只想使用一个实体并添加一个标志是否是注释;这将使其更清晰并避免继承问题。

或者您可以使用通用接口或抽象基类,而不是让这些类从另一个继承,而是从同一个基类继承,这也可以解决OfType问题。

或者如果继承真的正确,那么像这样过滤:Model.Notes().Where(n => n.GetType()=typeof(Note)),或者只是Model.Notes().Where(n => !(n is History))- 有很多方法可以到达罗马。

于 2012-12-30T15:54:24.393 回答
0

如果这是全貌,我不会在这里使用继承。您说 Note 和 History 项目有不同的 TypeId:s。

然后我会做以下事情:

@foreach(var item in Model.Notes().Where(x => x.TypeId == Note.NoteTypeId))
{
}

//and

@foreach(var item in Model.Notes().Where(x => x.TypeId == Note.HistoryTypeId))
{
}

public class Note
{
  public static int HistoryTypeId = 1;
  public static int NoteTypeId = 0;
  /* ... the rest of the implementation */
}

您还可以将 TypeId 更改为枚举并“隐藏”一些幻数

编辑:根据使用情况,您还可以将历史笔记的检查作为 Note 上的属性来实现。

public class Note
{
  /* ... other properties ... */
  public bool IsHistoric { get { return this.TypeId != 1; } }
}

然后检查很简单

@foreach(var note in Model.Notes().Where(x => x.IsHistoric))
{
}

// and

@foreach(var note in Model.Notes().Where(x => !x.IsHistoric())
{
}
于 2012-12-30T16:44:53.927 回答