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