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

C# 泛型如何解决不兼容的泛型类型约束,c#,C#,我有以下通用类: public class MyDbSetWrapper<T> : IDbSetWrapper<T> where T : class, IEntity { } 由于GetSet是第三方接口的实现,因此我无法更改此方法的通用约束以包括IEntity,即使TEntity始终是IEntity 如何从GetSet方法创建MyDbSetWrapper的新实例?编译时不能这样做。正如您自己所注意到的,为了创建新的MyDbSetWrapper,您需要

我有以下通用类:

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

}
由于
GetSet
是第三方接口的实现,因此我无法更改此方法的通用约束以包括
IEntity
,即使
TEntity
始终是
IEntity


如何从
GetSet
方法创建
MyDbSetWrapper
的新实例?

编译时不能这样做。正如您自己所注意到的,为了创建新的
MyDbSetWrapper
,您需要确保
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 GetSet() 地点:班级 { var type=typeof(MyDbSetWrapper)。MakeGenericType(typeof(tenty)); return(MyDbSetWrapper)Activator.CreateInstance(类型); }
请注意,这要求
IDbSetWrapper
IEntity
也没有约束。否则它将无法工作,因为您无法(再次)保证返回类型
IDbSetWrapper
中的
tenty
满足约束。

您可以删除
ienty
类型约束,并执行运行时检查,以查看传递的类型是否实现
ienty
@YuvalItzchakov:实际上,您不能;这将阻止您使用该类型的成员。@将禁用它,但OP是否需要使用该类型的成员?@YuvalItzchakov是的,我需要。也许我可以按照您的建议删除IEntity约束,并在需要访问该类型的成员时转换为IEntity,因为TEntity始终是一个IEntity。您正在实现的接口要求您愿意接受
string
作为类型参数。你不愿意这样做。因此,您不愿意实现该接口。找到一个您愿意实现的不同接口。
public IDbSetWrapper<TEntity> GetSet<TEntity>()
    where TEntity : class
{
    var type = typeof(MyDbSetWrapper<>).MakeGenericType(typeof(TEntity));
    return (MyDbSetWrapper<TEntity>) Activator.CreateInstance(type);
}