1

私は混乱している状況にあり、助けを求めていました。以下のコードでは、FindById メソッドはリターンをキャストしなくても機能しますが、UpdatedAuditedEntity 呼び出しは機能しません。ご了承ください:

  1. AuditedEntity は Entity から派生します
  2. auditedEntity のエンティティへのキャストは機能せず、T へのキャストのみが機能します。

ここで何が欠けているかについての洞察は大歓迎です。最初は分散が関係していると思っていましたが、前述のようにダウンキャストを試みましたが成功しませんでした。

    public class NHibernateRepository<T> : NHibernateBase,
    IRepository<T> where T : Entity
{

    public IEnumerable<T> FindAll(Expression<Func<T, bool>> predicate)
    {
        var query = GetQuery(predicate);
        return Transact(() => query.ToList());
    }

    public T FindById(int id)
    {
        // TODO: Why does this work when below doesn't
        return FindAll(e => e.Id == id).FirstOrDefault();
    }

    private T UpdateAuditedEntity(T item)
    {
        var auditedEntity = item as AuditedEntity;

        if (auditedEntity == null) return item;

        auditedEntity.DateModified = DateTime.UtcNow;

        // TODO: figure out why this cast is necessary
        return auditedEntity as T;
    }
4

2 に答える 2

2

これが必要なのは、AuditedEntity と T の両方が Entity から派生していますが、AuditedEntity は T によって表される型を継承しない可能性があるためです。

たとえば、エンティティを直接継承するタイプ「OtherEntity」を作成したとします。のインスタンスは、 NHibernateRepository<OtherEntity>UpdateAuditedEntity が、OtherEntity を継承しない AuditedEntity を返すようにするため、返される型は有効ではありません。

于 2012-05-16T14:04:26.207 に答える