我试图解决一个嘲讽的问题,通过创建IDbSet自定义模拟.
自定义模拟:
public class DbSetMock : IDbSet<Tenant>
{
/* hidden all other implemented methods/properties */
public TDerivedEntity Create<TDerivedEntity>() where TDerivedEntity : class, Tenant
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
create方法给出了一个构建错误,我不知道如何解决:
不能同时指定约束类和'class'或'struct'约束
简单地class从约束中删除会导致另一个构建错误(我也不明白:()).
方法'Tests.DAL.Tenants.DbSetMock.Create <TDerivedEntity>()'的类型参数'TDerivedEntity'的约束必须与接口方法'System.Data.Entity.IDbSet <BusinessLayer'的类型参数'TDerivedEntity'的约束匹配. DAL.Tenants.Tenant> .Create <TDerivedEntity>()".请考虑使用显式接口实现.
有人可以帮我成功建立这门课吗?
Jor*_*dão 14
由于TDerived类型参数被约束为a Tenant,因此添加约束class或者struct是冗余的.只需删除class约束.
更新:奇怪的是,这里的编译器错误之间似乎存在冲突.如果你"修复"一个你得到另一个,在一个无限的绝望循环.幸运的是,第二个错误也为我们提供了一条出路:您可以使用显式接口实现:
public class DbSetMock : IDbSet<Tenant>
{
TDerivedEntity IDbSet<Tenant>.Create<TDerivedEntity>()
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
有似乎是没有办法实施该方法不使用显式接口实现.如果你需要它作为类的公共接口的一部分,我建议创建另一个方法,接口实现转发到:
public class DbSetMock : IDbSet<Tenant>
{
TDerivedEntity IDbSet<Tenant>.Create<TDerivedEntity>()
{
return Create<TDerivedEntity>();
}
public TDerivedEntity Create<TDerivedEntity>() where TDerivedEntity : Tenant
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)