繁体   English   中英

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

[英]Generics how to resolve incompatible generic type constraints

我有以下泛型类:

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

}

我想从下面的GetSet方法创建此类的新实例。 以下不编译,因为MyDbSetWrapper期望TIEntity ,但TEntity IEntityGetSet方法中的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM