[英]Generics how to resolve incompatible generic type constraints
我有以下泛型类:
public class MyDbSetWrapper<T> : IDbSetWrapper<T>
where T : class, IEntity
{
}
我想从下面的GetSet
方法创建此类的新实例。 以下不编译,因为MyDbSetWrapper
期望T
是IEntity
,但TEntity
IEntity
于GetSet
方法中的GetSet
:
public IDbSetWrapper<TEntity> GetSet<TEntity>() where TEntity : class
{
return new MyDbSetWrapper<TEntity>();
}
由于GetSet
是第三方接口的实现,我无法改变此方法的通用约束以包含IEntity
,即使TEntity
始终是IEntity
。
如何从GetSet
方法创建MyDbSetWrapper
的新实例?
你不能在编译时这样做。 正如您自己注意到的,为了创建新的MyDbSetWrapper<TEntity>
您需要确保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>
满足约束条件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.