我有以下通用类:
public class MyDbSetWrapper<T> : IDbSetWrapper<T>
where T : class, IEntity
{
}
我想从下面的GetSet
方法创建此类的新实例。以下内容无法编译,因为MyDbSetWrapper
期望T
为IEntity
,但TEntity
并未被IEntity
限制为GetSet
public IDbSetWrapper<TEntity> GetSet<TEntity>() where TEntity : class
{
return new MyDbSetWrapper<TEntity>();
}
1}}方法:
GetSet
由于IEntity
是第三方界面的实现,我无法更改此方法的通用约束以包含TEntity
,即使IEntity
总是MyDbSetWrapper
是一个GetSet
。
如何从@NamedQuery(name = "UserFlight.getUserFlightDetails",
query = "SELECT new com.foobar.UserFlightDetails(uf.flight.divertedAirport, uf.flight.number) " +
"FROM UserFlight uf WHERE uf.user.id=?1 AND uf.flight.id=?2")
方法创建public UserFlightDetails(Airport airport, String flightNumber) {
this.setDivertedAirport(airport);
this.setFlightNumber(flightNumber);
}
的新实例?
答案 0 :(得分:0)
您无法在编译时执行此操作。正如您自己注意到的那样,为了创建新的TEntity
,您需要确保MyDbSetWrapper<>
至少满足IEntity
类型所需的相同类型约束。由于您无法做到这一点,因此无法使用编译时类型安全性创建类型。
如果您无法将public IDbSetWrapper<TEntity> GetSet<TEntity>()
where TEntity : class
{
var type = typeof(MyDbSetWrapper<>).MakeGenericType(typeof(TEntity));
return (MyDbSetWrapper<TEntity>) Activator.CreateInstance(type);
}
类型移动到可访问的位置,则只能在此处使用反射:
IDbSetWrapper<T>
请注意,这要求IEntity
对TEntity
没有约束。否则它将无法正常工作,因为您无法保证(再次)返回类型IDbSetWrapper<TEntity>
中的{{1}}满足约束条件。