【发布时间】:2011-09-23 18:20:15
【问题描述】:
在通过 TypeBuilder 创建的类型上使用 typeof 运算符时,该运算符将返回 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);
}
如果你在变量o 之后放置一个断点并在VS 即时窗口中键入typeof(MyType),你就会遇到问题。
【问题讨论】:
-
您能否发布一个简短但完整的程序来演示该问题?
-
是的,如果不查看一些代码,我们无法真正确定问题。
-
如何在编译时不存在的类型上使用
typeof? 真的需要在这里查看一些代码... -
@Jon 我实际上在将 CLR 更正为编译器之前打错了:P 不过,您是正确的,因为我们需要查看 codez
-
@Marc:问题是你和里卡多正在互相交谈;他说的是运行时表达式求值器中 typeof 运算符的行为,而您说的是编译代码中 typeof 的行为。这是两个截然不同的子系统,它们使用 CLR 的不同部分。 Ricardo 显然在运行时表达式求值器中发现了一个奇怪的地方。在只执行静态分析的编译器版本的运算符中肯定不会发现类似的奇怪之处。