Пример #1
0
        /// <summary>
        /// Implements all given abstract methods by throwing
        /// <see cref="NotSupportedException"/>s.
        /// </summary>
        /// <param name="typeBuilder">The type builder to use.</param>
        /// <param name="methods">The methods to implement.</param>
        /// <param name="errorMessage">
        /// The error message to use for all exceptions.
        /// </param>
        private static void ImplementNotSupported(
            TypeBuilder typeBuilder,
            ImportMethod[] methods,
            string errorMessage)
        {
            foreach (var importMethod in methods)
            {
                // Define the implementation method
                var notImplementedMethod =
                    importMethod.DefineImplementationMethod(typeBuilder);
                DefineWrapperParameters(
                    notImplementedMethod,
                    importMethod.GetParameters());

                // Define wrapper method body
                var generator = new ILEmitter(notImplementedMethod.GetILGenerator());
                generator.EmitConstant(errorMessage);
                generator.EmitNewObject(NotSupportedExceptionConstructor);
                generator.Emit(OpCodes.Throw);
                generator.Emit(OpCodes.Ret);

                // Define method override
                typeBuilder.DefineMethodOverride(
                    notImplementedMethod,
                    importMethod.Method);
            }
        }
Пример #2
0
        /// <summary>
        /// Implements the <see cref="RuntimeAPI.IsSupported"/> property.
        /// </summary>
        private static void ImplementIsSupported <T>(
            TypeBuilder typeBuilder,
            bool isSupported)
            where T : RuntimeAPI
        {
            var abstractMethod = typeof(T)
                                 .GetProperty(nameof(RuntimeAPI.IsSupported))
                                 .GetGetMethod();
            var wrapperMethod = typeBuilder.DefineMethod(
                abstractMethod.Name,
                abstractMethod.Attributes & ~ImplAttributesToClear,
                abstractMethod.GetReturnType(),
                Array.Empty <Type>());
            var generator = new ILEmitter(wrapperMethod.GetILGenerator());

            generator.EmitConstant(Convert.ToInt32(isSupported));
            generator.Emit(OpCodes.Ret);

            typeBuilder.DefineMethodOverride(wrapperMethod, abstractMethod);
        }