Generics 某些情况下需要在泛型方法上显式转换为T
我有一个让我困惑的情况,希望能得到一些帮助。在下面的代码中,FindById方法不必强制转换返回,但是updateAuditedEntity调用不需要。请注意:Generics 某些情况下需要在泛型方法上显式转换为T,generics,c#-4.0,Generics,C# 4.0,我有一个让我困惑的情况,希望能得到一些帮助。在下面的代码中,FindById方法不必强制转换返回,但是updateAuditedEntity调用不需要。请注意: AuditedEntity源于实体 将auditedEntity强制转换为实体不起作用,仅强制转换为t起作用 如果您能了解我在这里遗漏的内容,我们将不胜感激。起初我认为这与变化有关,但正如我上面提到的,我试着降低了演员阵容,但没有成功 public class NHibernateRepository<T> : NH
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;
}
公共类NHibernateRepository:NHibernateBase,
i假设式,其中T:实体
{
公共IEnumerable FindAll(表达式谓词)
{
var query=GetQuery(谓词);
返回Transact(()=>query.ToList());
}
公共T FindById(int id)
{
//TODO:为什么在下面不起作用的情况下,这个功能还能工作
返回FindAll(e=>e.Id==Id).FirstOrDefault();
}
私有T UpdateAuditEntity(T项)
{
var auditedEntity=作为auditedEntity的项目;
如果(auditedEntity==null)返回项;
auditedEntity.DateModified=DateTime.UtcNow;
//TODO:找出为什么这个演员阵容是必要的
将被审核的数据返回为T;
}
这是必要的,因为尽管AuditedEntity和T都派生自实体,但AuditedEntity可能不会继承由T表示的任何类型
例如,假设您创建了一个类型“OtherEntity”直接继承的实体。
NHibernateRepository
的实例将具有UpdateAddEntity返回AuditedEntity,该属性不继承其他实体-因此返回的类型将无效。这是必要的,因为尽管AuditedEntity和T都是从实体派生的,但AuditedEntity可能不会继承任何Type由T表示
例如,假设您创建了一个直接继承实体的类型“OtherEntity”。NHibernateRepository
的实例将具有UpdateAddItemEntity返回AuditedEntity,而AuditedEntity不继承OtherEntity,因此返回的类型将无效
AuditedEntity源于实体
好的,但是在这个泛型类中,T
是实体
的任意派生。编译器不关心您的auditedEntity
是通过强制转换项
创建的-实际上,这里可能有自定义转换在进行意外操作-因此不允许您返回变量从请求T
的方法中键入为AuditedEntity
在这个特定的方法中,由于项
和审核属性
是同一个对象,因此您只需执行以下操作即可
return item;
作为updateAditeIdentity
的最后一条语句,编译器会很高兴的
AuditedEntity源于实体
好的,但是在这个泛型类中,T
是实体
的任意派生。编译器不关心您的auditedEntity
是通过强制转换项
创建的-实际上,这里可能有自定义转换在进行意外操作-因此不允许您返回变量从请求T
的方法中键入为AuditedEntity
在这个特定的方法中,由于项
和审核属性
是同一个对象,因此您只需执行以下操作即可
return item;
作为
updateuditedentity
的最后一条语句,编译器会很高兴的。一般来说这是正确的,但是看看updateuditedentity
的主体-如果T
不是(an)AuditedEntity
,它返回null。在问题行中,我们了解有关T
的更多信息,但编译器没有t@AskashM:您的观点对于避免方法体中的转换是有效和实用的,但我将问题解释为为什么OP不能从方法返回AuditedEntity类型的实例。OP似乎是未执行的r错误理解从实体继承会使转换变得不必要。一般来说,这是正确的,但请查看UpdateAddIdentity
-的主体,如果T
不是(an)AuditedEntity
,它返回null。在问题行中,我们了解有关T
的更多信息,但编译器没有t@AskashM:您的观点对于避免方法体中的转换是有效和实用的,但我将问题解释为为什么OP不能从方法返回AuditedEntity类型的实例。OP似乎是未执行的r错误理解从实体继承会使转换变得不必要。