Я занимаюсь хакерством с Reflection Emit в F #. Я пытаюсь сделать эквивалент этого кода С#:
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*. (Обратите внимание, что это IntPtr для nativeint или любого другого типа)
Кроме того, я хотел бы иметь возможность использовать структуру, которую я определил программно, и иметь Foo* в другой структуре, но, очевидно, в этом случае я не могу использовать typeof (ни в C#, ни в F#). Есть ли способ определить поле как Foo* из Type/TypeBuilder?
Прежде чем кто-либо укажет, что все это потенциально безумно (и я согласен), это забавный проект для меня, чтобы выяснить, насколько сумасшедшим я могу генерировать код, который С# не может мне позволить :)