代码之家  ›  专栏  ›  技术社区  ›  Sarah Vessels

将类型赋给变量,将变量与泛型静态类一起使用

  •  4
  • Sarah Vessels  · 技术社区  · 15 年前

    我在一个C Web服务中使用一个采用类型的通用静态类。我想知道为什么这不编译:

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

    它给出了这个错误:

    找不到类型或命名空间名称“type1”(是否缺少using指令或程序集引用?)

    当我在空中盘旋的时候 type1 在第二行代码中,表示“需要类型或名称空间名称”。好, 1型 A型!它是一个类型的变量 Type !如果我这样做,它也不起作用:

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

    我希望把我的类型分配给几个不同的 类型 变量,并在测试不同的通用静态类时使用这些变量,而不是键入 MySnazzyType 每一次。有什么想法,还是我一直在做:

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

    编辑: 澄清, MySnasZyType 泛型类,也不从泛型类继承。这里唯一的泛型类是 ConnectionPool_Accessor .

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

    3 回复  |  直到 15 年前
        1
  •  3
  •   Lasse V. Karlsen    15 年前

    首先,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);
        }
    }
    
        2
  •  3
  •   Fredrik Mörk    15 年前

    泛型类型的计算位置为 编译时间 不在 运行时 . 因为它不能在运行时确定什么 type1 将是,不允许此构造。

    这就是雷斯哈珀所说的: 1型 不是类型,而是类型的变量 Type ,(就像它可以是类型的对象一样 String )

        3
  •  1
  •   Thorarin    15 年前

    这个 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动态类型,否则这将是臀部的主要疼痛。