c# - 类型 T 必须是引用类型,以便在使用接口(interface)时将其用作参数

标签 c# oop generics interface moq

我收到以下代码的错误

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而不是 classT .我怎样才能做到这一点?

最佳答案

classstructgeneric type constaintsclass 的意思不同和 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/

相关文章:

c# - 在方法中途添加泛型类型约束

c# - 哪种算法更适合在数据库中隐藏重要字符串? (该字符串不是密码)

c# - 用于简单 .NET 应用程序的 ORM

c# - 查找服务设置为哪个帐户 "Log On As"

php - 为什么要返回新的静态? (PHP)

oop - 类只有静态字段和方法是不好的做法吗?

Swift:扩展可选数组

javascript - 执行 javascript 'undefined' 输出但它按预期工作

c++ - 成员类可以从它的父类继承吗?

java - 循环泛型代码设计