泛型如何解决不兼容的泛型类型约束

时间:2015-11-15 14:56:26

标签: c#

我有以下通用类:

public class MyDbSetWrapper<T> : IDbSetWrapper<T>
        where T : class, IEntity
{

}

我想从下面的GetSet方法创建此类的新实例。以下内容无法编译,因为MyDbSetWrapper期望TIEntity,但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); } 的新实例?

1 个答案:

答案 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>

请注意,这要求IEntityTEntity没有约束。否则它将无法正常工作,因为您无法保证(再次)返回类型IDbSetWrapper<TEntity>中的{{1}}满足约束条件。

相关问题