我在C#Web服务中工作,其中具有类型的通用静态类。我想知道为什么这不会编译:

Type type1 = typeof(MySnazzyType);
Assert.AreEqual(0, ConnectionPool_Accessor<type1>._pool.Count);

它给出了这个错误:

找不到类型或名称空间名称'type1'(您是否缺少使用指令或汇编引用?)

和弹奏者,当我徘徊的时候 type1 在第二行代码中,说“类型或名称名称预期”。出色地, type1 一种!这是类型的变量 Type呢如果我这样做也无效:

Type type1 = typeof(MySnazzyType);
Assert.AreEqual(0, ConnectionPool_Accessor<typeof(type1)>._pool.Count);

我希望将我的类型分配给几个不同的 Type 变量,只是在测试不同的通用静态类中使用的变量,而不是输入 MySnazzyType 每一次。任何想法,还是我坚持这样做:

Assert.AreEqual(0, ConnectionPool_Accessor<MySnazzyType>._pool.Count);

编辑: 澄清, MySnazzyType不是 通用类,也不是从通用类继承的。这里唯一的通用类是 ConnectionPool_Accessor.

多亏了帕维尔(Pavel)的评论:“从本质上讲,您的问题是C#是一种静态打字的语言”,我现在知道Ruby宠坏了我。 )

有帮助吗?

解决方案

首先,Resharper实际上是正确的。不是 类型, , 它是 多变的. 。当然,这是一个具有与类型相对应的反射对象的变量,但这还不够。

在<...>括号之间,您必须编写类型的名称,而不是任何其他标识符的名称。

但是,您可以通过反射构建通用对象,并访问其属性,甚至静态对象,因此您应该能够重写代码以做到这一点,但是您是否查看了Nunit 2.5?

从最新的发行说明中,看来单元测试类现在可以通用,您可以在测试类上指定使用该属性进行测试的属性。

这将使您写下这样的东西(注意,我尚未测试过,我只查找文档中新属性的名称):

[TestFixture(typeof(MySnazzyType))]
[TestFixture(typeof(MyOtherSnazzyType))]
public class Tests<T>
{
    [Test]
    public void PoolCount_IsZero()
    {
        Assert.AreEqual(0, ConnectionPool_Accessor<T>._pool.Count);
    }
}

其他提示

评估通用类型 编译时间, ,不在 运行. 。由于无法在运行时确定什么 type1 将不允许这种结构。

这实际上就是Resharper所说的: type1 不是类型,它是类型的变量 Type, ,(就像它是类型的对象一样 String).

TestFixture 属性应该为您设置,但仅仅是为此:如果您想在运行时执行所有操作,则可以使用反射来做到这一点。

Type poolType = typeof(ConnectionPool_Accessor<>);
Type snazzyType = typeof(MySnazzyType); // Or however you want to get the appropriate Type
poolType.MakeGenericType(snazzyType);

然后,您可以继续使用反思来执行您想做的任何事情 poolType. 。当然,除非您使用C#4.0动态键入,否则这将是屁股的重大痛苦。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top