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);
}