9

typeof在通过 TypeBuilder 创建的类型上使用运算符时,该运算符将返回 null。

我很好奇为什么会发生这种情况以及如何防止它。


我开始认为这是即时窗口中的 VS 错误,但我不太确定。首先责备别人是很容易的。

好的...重现问题的代码:

    static void Main()
    {
        AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
            new AssemblyName("MyAssembly"),
            AssemblyBuilderAccess.RunAndSave);
        ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MyModule");
        TypeBuilder typeBuilder = moduleBuilder.DefineType("MyType", TypeAttributes.Public, typeof(ArrayList));

        ArrayList o = (ArrayList)Activator.CreateInstance(typeBuilder.CreateType());

        Console.WriteLine(o.GetType().Name);
    }

如果您在变量后放置一个断点并在 VS Immediate Windows 中o键入,您将遇到问题。typeof(MyType)

4

2 回答 2

21

当对通过 TypeBuilder 创建的类型使用 typeof 运算符时,该运算符将返回 null。

首先,索赔是正确的。如果您编写此程序,然后在调试器中停止它并在即时窗口中说“typeof(MyType)”,则返回的结果为“null”。

我很好奇为什么会这样

打败了我。如果我不得不猜测,我会说表达式评估器可能正在与 CLR 的调试子系统通信,以尝试通过其名称获取类型的元数据令牌,而 CLR 正在返回一些垃圾 nil 令牌而不是产生错误.

我赶紧强调这是一个猜测;我还没有真正调试过它。

我开始认为这是即时窗口中的 VS 错误

这似乎很可能。它应该做的正确事情是给出错误“类型或命名空间'MyType'在此范围内无效”。该错误几乎肯定会出现在 C# 运行时表达式求值器中,而不是即时窗口本身。

感谢您提请我注意这个问题。我将向表达式评估器维护者提交一个错误,我们将看看他们是否可以解决这个问题。

如何预防?

如果您在键入“typeof(MyType)”时感到疼痛,请停止键入。

于 2011-06-27T20:35:10.160 回答
6

如果在 VS Immediate Windows 中的变量 'o' 和类型 typeof(MyType) 之后放置一个断点,你就会遇到问题。

嗯,是的。MyType没有符号(您正在使用反射定义它!),因此您不能typeof在其上使用。

编辑:为澄清起见,您可以使用typeof并获得运行时创建的类型:当您使用泛型时。

Type MyMethod<T>() where T : class {
    return typeof(T);
}

Type myType = //create type dynamically;

Type myOtherType = //invoke MyMethod with myType as the type parameter

Debug.Assert(myType == myOtherType); //will not fire
于 2011-06-27T19:22:12.653 回答