我在F#中使用Reflection Emit做了一些黑客攻击。我试图做相当于这个C#代码:
var ass = AppDomain.CurrentDomain.DefineDynamicAssembly(new AssemblyName("Test"), AssemblyBuilderAccess.RunAndSave);
var mb = ass.DefineDynamicModule("Test", "Test.dll", false);
var t = mb.DefineType("Foo", TypeAttributes.Public, typeof(ValueType));
t.DefineField("foo", typeof(int*), FieldAttributes.Public);
t.CreateType();
ass.Save("Test.dll");
该线特别是定义线。在F#中,我能得到的最接近的是
let f = t.DefineField("foo", (typeof<nativeptr<int>>), FieldAttributes.Public)
然而,编译后的字段最终被编译为IntPtr类型而不是int *。(注意它是针对nativeint或任何其他类型的IntPtr)
此外,我希望能够使用我以编程方式定义的结构,并在另一个结构中使用Foo *,但显然我在这种情况下无法使用typeof(在C#中或F#)。有没有办法从Type / TypeBuilder中将字段定义为Foo *?
在有人指出这可能是疯狂的(并且我同意)之前,我自己想出一个有趣的项目来弄清楚C#mignt不会让我生成的代码有多疯狂:)
答案 0 :(得分:2)
我相信ilsigptr<int>
是C#&#39; s int*
的F#对应部分。
另见: