【问题标题】:C# type or namespace expected confusionC# 类型或命名空间预期混淆
【发布时间】:2011-10-30 12:36:23
【问题描述】:

我被一个 C# 错误弄糊涂了。

Type t = thing.GetType()

t 现在是一种类型。但如果我尝试这样做:

new GenericThing<t>

我收到一条警告说需要类型或命名空间。我错过了什么?

【问题讨论】:

    标签: c# types namespaces


    【解决方案1】:

    你应该这样做:

    var youGeneric = typeof(GenericThing<>).MakeGenericType(t)
                                           .GetConstructor(Type.EmptyTypes)
                                           .Invoke(null);
    

    【讨论】:

      【解决方案2】:

      Type 是一个表示类型而不是真正存在类型的类,因此您不能在需要类型的地方使用Type的实例或类型参数。

      【讨论】:

        【解决方案3】:

        tType 类型的对象实例,即仅在运行时存在的东西。泛型在编译时工作,需要类型的名称。

        我认为您同意以下内容没有意义:

        Type t = thing.GetType()
        TypeOfThing instance = new t();
        

        出于同样的原因,您不能将类型实例作为泛型的参数传递。

        【讨论】:

          【解决方案4】:

          t 是在运行时创建的 Type 对象。泛型需要一个类型名称,在编译时解析。要在运行时创建泛型,您必须使用MakeGenericType

          例如:

          Activator.CreateInstance(typeof(GenericThing<>).MakeGenericType(t));
          

          【讨论】:

            猜你喜欢
            • 2012-09-06
            • 2023-01-30
            • 2012-03-29
            • 2014-04-14
            • 1970-01-01
            • 2012-03-03
            • 1970-01-01
            • 2013-03-25
            • 2022-06-17
            相关资源
            最近更新 更多