コード例 #1
0
        public Unit nativeFinishType(Runtime.Struct typeValue, TypeBuilder typeBuilder)
        {
            foreach (var field in typeValue.Fields)
            {
                typeBuilder.DefineField(field.Name, TypeBox.Unbox(field.Type), FieldAttributes.Public | FieldAttributes.InitOnly);
            }

            // Constructor
            var constuctor = typeBuilder.DefineConstructor(
                MethodAttributes.Public, CallingConventions.Standard,
                typeValue.Fields.Select(field => TypeBox.Unbox(field.Type)).ToArray()
                );

            ILGenerator ilgen = constuctor.GetILGenerator();

            for (int i = 0; i < typeValue.Fields.Count(); i++)
            {
                ilgen.Emit(OpCodes.Ldarg_0);
                ilgen.Emit(OpCodes.Ldarg, i + 1);
                ilgen.Emit(OpCodes.Stfld, typeBuilder.GetField(typeValue.Fields[i].Name));
            }
            ilgen.Emit(OpCodes.Ret);

            // TODO: ToString
            // TODO: structural equality
            // TODO: structural comparison
            // TODO: structural hashcode

            return(Unit.Instance);
        }
コード例 #2
0
 public object array(object itemType)
 {
     return(typeof(IImmutableList <>).MakeGenericType(TypeBox.Unbox(itemType)));
 }