示例#1
0
        public void CallBaseConstructorNonGeneric()
        {
            AssemblyBuilder assembly = Errors.DefineDynamicAssembly();

            ModuleBuilder module = assembly.DefineDynamicModule("RuntimeModule");

            TypeBuilder type = module.DefineType("Class", TypeAttributes.Class, typeof(ClassWithCtor));

            Sigil.NonGeneric.Emit ctor = Sigil.NonGeneric.Emit.BuildConstructor(Type.EmptyTypes, type, MethodAttributes.Public);

            ConstructorInfo baseCtor = typeof(ClassWithCtor).GetConstructor(new[] { typeof(string) });

            ctor.LoadArgument(0);
            ctor.LoadConstant("abc123");
            ctor.Call(baseCtor);
            ctor.Return();
            ctor.CreateConstructor();

            Type createdType = type.CreateType();

            ClassWithCtor instance = (ClassWithCtor)Activator.CreateInstance(createdType);

            Assert.IsInstanceOf(createdType, instance);
            Assert.AreEqual("abc123", instance.Value);
        }
示例#2
0
        public static Sigil.NonGeneric.Emit Box(this Sigil.NonGeneric.Emit emitter, Type typeFrom, bool castIfRefType)
        {
            if (typeFrom.IsByRef)
            {
                var baseType = typeFrom.GetElementType();

                if (baseType.IsPrimitive)
                {
                    return(emitter.LoadIndirect(baseType).Box(baseType));
                }

                if (baseType.IsValueType)
                {
                    return(emitter.LoadObject(baseType).Box(baseType));
                }

                if (!baseType.IsValueType)
                {
                    return(emitter.LoadIndirect(baseType));
                }

                throw new NotSupportedException(typeFrom.FullName + " not supported in this context");
            }

            if (!typeFrom.IsValueType)
            {
                return(emitter.CastClass(typeFrom));
            }

            return(emitter.Box(typeFrom));
        }
示例#3
0
        public static Sigil.NonGeneric.Emit Unbox(this Sigil.NonGeneric.Emit emitter, Type typeTo, bool castIfRefType)
        {
            if (!typeTo.IsValueType)
            {
                return(emitter.CastClass(typeTo));
            }

            return(emitter.Unbox(typeTo));
        }