C# 将类型分配给变量,将变量与泛型静态类一起使用

C# 将类型分配给变量,将变量与泛型静态类一起使用,c#,generics,types,static-typing,C#,Generics,Types,Static Typing,我在一个C#web服务中工作,该服务具有一个类型为的通用静态类。我想知道为什么这不能编译: Type type1 = typeof(MySnazzyType); Assert.AreEqual(0, ConnectionPool_Accessor<type1>._pool.Count); 我希望将我的类型分配给两个不同的Type变量,并在测试不同的泛型静态类时使用这些变量,而不是每次都键入MySnazzyType。有什么想法吗,或者我一直在做: Assert.AreEqual(0,

我在一个C#web服务中工作,该服务具有一个类型为的通用静态类。我想知道为什么这不能编译:

Type type1 = typeof(MySnazzyType);
Assert.AreEqual(0, ConnectionPool_Accessor<type1>._pool.Count);
我希望将我的类型分配给两个不同的
Type
变量,并在测试不同的泛型静态类时使用这些变量,而不是每次都键入
MySnazzyType
。有什么想法吗,或者我一直在做:

Assert.AreEqual(0, ConnectionPool_Accessor<MySnazzyType>._pool.Count);
Assert.AreEqual(0,ConnectionPool\u访问器.\u pool.Count);
编辑:为了澄清,
MySnazzyType
不是泛型类,也不是从泛型类继承的。这里唯一的泛型类是
ConnectionPool\u Accessor


多亏了Pavel的评论“本质上,你的问题是C#是一种静态类型语言”,我现在知道Ruby已经宠坏了我

泛型类型在编译时计算,而不是在运行时。由于无法在运行时确定什么是
type1
,因此不允许使用此构造


这实际上是Resharper所说的:
type1
不是一个类型,它是
Type
类型的变量(就像它可以是
字符串类型的对象一样)

首先,ReSharper实际上是正确的。它不是类型,而是变量。当然,它是一个保存与类型对应的反射对象的变量,但这还不够

在括号之间,必须写入类型的名称,而不是任何其他标识符的名称

但是,您可以通过反射构造通用对象,并访问它们的属性,即使是静态属性,因此您应该能够重写代码来实现这一点,但是,您看过NUnit 2.5吗

从最新的发行说明中可以看出,单元测试类现在可以是泛型的,并且您可以使用测试类上的属性指定要测试它的类型

这将允许您编写类似这样的内容(注意,我没有对此进行测试,我只是在文档中查找新属性的名称):

[TestFixture(typeof(MySnazzyType))]
[TestFixture(typeof(MyOtherSnazzyType))]
公开课考试
{
[测试]
公共无效池计数为零()
{
Assert.AreEqual(0,ConnectionPool\u访问器.\u pool.Count);
}
}

TestFixture
属性应该对您进行设置,但只是为了检查一下:如果您想在运行时完成所有这些,可以使用反射来完成

Type poolType = typeof(ConnectionPool_Accessor<>);
Type snazzyType = typeof(MySnazzyType); // Or however you want to get the appropriate Type
poolType.MakeGenericType(snazzyType);
Type poolType=typeof(ConnectionPool\u访问器);
类型snazzyType=typeof(MySnazzyType);//或者您希望以何种方式获得适当的类型
poolType.MakeGenericType(snazzyType);

然后,您可以使用
poolType
上的反射继续执行任何您想要的操作。当然,除非你使用C#4.0动态打字,否则这将是一个巨大的麻烦。

Er,你有没有交换你想说的话?也许“泛型类型是在运行时计算的,而不是在编译时。”此外,为什么它不能在编译类型确定什么是
type1
,因为它被写成
typeof(MySnazzyType)
?不,他写得正确。本例中的泛型类型是
ConnectionPool\u Accessor
,它确实是在编译时解析的。在这一点上,没有办法知道
type1
将解析为什么类型。本质上,您的问题是C#是一种静态类型的语言。重复:
type1
是一个类型变量参考
系统。键入
。后者不是一种类型!这是一个类,它的实例描述了一个类型。@Sarah:另一个术语“编译时”是错误的。更正了。关于为什么它不能计算出什么是
type1
,我想编译器并没有走那么远。即使是这样,
type1
仍然是一个变量,而不是类型。s/宠坏了我/教会了我不礼貌/;-)
[TestFixture(typeof(MySnazzyType))]
[TestFixture(typeof(MyOtherSnazzyType))]
public class Tests<T>
{
    [Test]
    public void PoolCount_IsZero()
    {
        Assert.AreEqual(0, ConnectionPool_Accessor<T>._pool.Count);
    }
}
Type poolType = typeof(ConnectionPool_Accessor<>);
Type snazzyType = typeof(MySnazzyType); // Or however you want to get the appropriate Type
poolType.MakeGenericType(snazzyType);