我收到以下代码的错误
public static Moq.Mock<T> CreateInstanceOfIMock<T>() {
return new Moq.Mock<T>();
}
我有solved使用引用的错误 class
类型。请参阅下面的代码
public static Moq.Mock<T> CreateInstanceOfIMock<T>() where T : class
{
return new Moq.Mock<T>();
}
现在我想移动这个var mockColorsRepository = new Moq.Mock<IColorsRepository>();
使用 generics
将代码转换为通用代码.这里IColorsRepository
是一个 interface
.所以我为T
做了一个接口(interface)引用而不是 class
就像下面的代码
public static Moq.Mock<T> CreateInstanceOfIMock<T>() where T : interface
{
return new Moq.Mock<T>();
}
但是我得到了 The type T must be a reference type in order to use it as parameter
错误。我怎样才能引用 interface
而不是 class
至 T
.我怎样才能做到这一点?
最佳答案
class
和 struct
在 generic type constaints与 class
的意思不同和 struct
用于声明类或结构类型的声明。相反,它们仅限制泛型类型参数是引用类型 ( class
) 还是值类型 ( struct
)。
所以当你做 where T : class
你不是说T
需要上课,你是说T
需要是引用类型。同样struct
对于值类型。
接口(interface)本身没有这个属性,所以一个接口(interface)既可以由引用类型实现,也可以由值类型实现。因此,将您的类型限制为接口(interface)并没有真正意义。
在您的情况下,Moq 要求您传递一个引用类型,因此您需要在所有辅助方法中传递该类型约束:
public static Moq.Mock<T> CreateInstanceOfIMock<T>()
where T : class
{
return new Moq.Mock<T>();
}
这就是创建任何有效类型的 mock 所需要做的全部。您可以使用 CreateInstanceOfIMock<IColorsRepository>()
将其与界面一起使用或任何其他类型。
当然,在这一点上,该方法并没有真正意义,因为与您自己实例化模拟相比,它不会给您带来任何好处。
关于c# - 类型 T 必须是引用类型,以便在使用接口(interface)时将其用作参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47567544/