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 を継承しています。これらはまったく同じです。2 つの違いはタイプ 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アイテムとHistoryアイテムのTypeIdが異なるとおっしゃいました。

次に、次のことを行います。

@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を列挙型に変更して、マジックナンバーの一部を「非表示」にすることもできます。

編集:使用法によっては、履歴メモのチェックをメモのプロパティとして実装することもできます。

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 に答える
0

ここでは全体像がわからないかもしれませんが、1 つのクラスのみを使用することを検討します - Note. 代わりに、そのクラスにプロパティがあります - IsHistoric。次に、タイプではなくプロパティに基づいてチェックを行います。

于 2012-12-30T15:54:16.593 に答える
0

aHistoryは aであるため、インスタンスも含めNoteます。これは意図的なものですか?Model.Notes().OfType<Note>()History

エンティティを 1 つだけ使用して、それがメモかどうかのフラグを追加することができます。それはそれをより明確にし、継承の問題を回避します。

または、共通のインターフェイスまたは抽象基本クラスを使用して、クラスが一方を他方から継承するのではなく、両方を同じ基本から継承させることもできます。これにより、OfType問題も修正されます。

または、継承が本当に正しい場合は、次のようにフィルタリングします: Model.Notes().Where(n => n.GetType()=typeof(Note))、または単にModel.Notes().Where(n => !(n is History))- ローマに到達する方法はたくさんあります。

于 2012-12-30T15:54:24.393 に答える