我正在努力通过编写一些可以为我创建属性的帮助程序来使EF更容易进行单元测试。我有几个支持领域
private Mock<DbSet<Workflow>> mockedWorkFlows;
private Mock<DbSet<WorkflowError>> mockedWorkFlowErrors;
我想要一个通用函数能够使用以下函数返回正确的支持字段
public Mock<DbSet<T>> Mocked<T>(T t) where T : class
{
if ( (object)t is Workflow)
{
return mockedWorkFlows; //cannot Workflow to T
}
}
我想根据传递它的类型返回几个私有支持字段。
但是,即使我添加了Workflow
的类约束,我也会遇到同样的错误。
我也试过打开t's
类型,但也没有运气。除了object之外,几个支持字段的类型不共享共同的祖先。我正在尝试做什么?
答案 0 :(得分:6)
如果我理解你的意图 - 你可以这样做:
// no need to pass instance of T - why?
public Mock<DbSet<T>> Mocked<T>() where T : class
{
if (typeof(T) == typeof(Workflow)) {
// first cast to object, then to return type to avoid compile error
// compiler does not know mockedWorkFlows is Mock<DbSet<T>>, but you
// know it already, because you checked type 'T'
return (Mock<DbSet<T>>) (object) mockedWorkFlows; //cannot Workflow to T
}
// etc
return null;
}
是否好主意是另一回事。
答案 1 :(得分:5)
有可能严重滥用C#7的switch
来实现您想要的效果,方法是启用不相关的值并将var
模式与when
警卫一起使用:
public Mock<DbSet<T>> Mocked<T>() where T : class
{
switch(true)
{
case var _ when typeof(T) == typeof(Workflow):
return ...
case var _ when typeof(T) == typeof(WorkflowError):
return ...
default:
return null;
}
}
能够匹配switch
语句中的类型是一个非常常见的请求。在github上的官方语言仓库中有关于改进C#的建议(参见Proposal: switch on System.Type和p Proposal: Pattern match via generic constraint)。当更多模式匹配功能添加到C#(currently, set for "a 7.X release")时,我们可能会获得更好的语法来实现此功能。