zoukankan      html  css  js  c++  java
  • MSIL实用指南-生成接口


    本篇讲解怎么样生成接口,即interface。

    一、创建类型
    创建一个接口类型依旧用ModuleBuilder的DefineType方法,但是它的第二个参数必须要有
    TypeAttributes.Interface | TypeAttributes.Abstract。这样才能是一个接口类型。

    实例代码:

    TypeBuilder typeBuilder = moduleBuilder.DefineType(namespaceName + "." + typeName,
    TypeAttributes.Public
    | TypeAttributes.Interface
    | TypeAttributes.Abstract
    );

    二、给接口添加继承父接口
    按照C#语言规范,一个接口可以继承多个接口。在这里我们要用TypeBuilder的AddInterfaceImplementation
    方法,参数是一个Type。

    实例代码:

    typeBuilder.AddInterfaceImplementation(typeof(System.IDisposable));
    typeBuilder.AddInterfaceImplementation(typeof(System.IConvertible));

    三、实现成员
    C#的接口内的成员必须是public的,而且只能声明,不能实现。所以接口方法必须是
    MethodAttributes.Public | MethodAttributes.Abstract | MethodAttributes.Virtual ,
    接口内属性的get和set方法必须也是如此。


    完整的程序如下:

    using System;
    using System.Reflection;
    using System.Reflection.Emit;
    
    namespace LX1_ILDemo
    {
        public class Demo22_InterfaceBuilder
        {
            public static void Generate()
            {
                /*
                public interface IMyDynamicInteface
                {
                    int Number{get;set;}             
                    int MyMethod(int multiplier);
                }
                */
                string binaryName = "Demo22_InterfaceBuilder.dll";
                string namespaceName = "LX1_ILDemo";
                string typeName = "DemoInterface";
    
                AssemblyName assemblyName = new AssemblyName(namespaceName);
                AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
                ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name, binaryName);
    
                TypeBuilder typeBuilder = moduleBuilder.DefineType(namespaceName + "." + typeName,
                    TypeAttributes.Public
                    | TypeAttributes.Interface
                    | TypeAttributes.Abstract
                    );
    
                typeBuilder.AddInterfaceImplementation(typeof(System.IDisposable));
                typeBuilder.AddInterfaceImplementation(typeof(System.IConvertible));
    
                PropertyBuilder pbNumber = typeBuilder.DefineProperty(
                    "Number",
                    PropertyAttributes.HasDefault,
                    typeof(int),
                    null);
    
    
                MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.Abstract | MethodAttributes.Virtual |
                    MethodAttributes.SpecialName | MethodAttributes.HideBySig;
    
                MethodBuilder mbNumberGetAccessor = typeBuilder.DefineMethod(
                    "get_Number",
                    getSetAttr,
                    typeof(int),
                    Type.EmptyTypes);
    
                MethodBuilder mbNumberSetAccessor = typeBuilder.DefineMethod(
                    "set_Number",
                    getSetAttr,
                    null,
                    new Type[] { typeof(int) });
    
                pbNumber.SetGetMethod(mbNumberGetAccessor);
                pbNumber.SetSetMethod(mbNumberSetAccessor);
    
                MethodBuilder meth = typeBuilder.DefineMethod(
                    "MyMethod",
                    MethodAttributes.Public | MethodAttributes.Abstract | MethodAttributes.Virtual,
                    typeof(int),
                    new Type[] { typeof(int) });
    
                Type t = typeBuilder.CreateType();
    
                assemblyBuilder.Save(binaryName);
    
                Console.WriteLine("创建接口IMyDynamicInteface完毕");
                Console.ReadKey();
            }
        }
    }
    View Code
  • 相关阅读:
    ftp上传工具类&FTPClient通过代理连接到FTP服务器
    JS判断闰年与获取月份天数
    SpringBoot文件上传文件大小限制The field file exceeds its maximum permitted size of 1048576 bytes.
    JSON.parse解析json字符串包含 回车换行符报错
    JS解决加减乘除浮点类型丢失精度问题
    Mysql连接异常java.sql.SQLException: The server time zone value '?й???????' is unrecognized or represents more than one time zone.
    Springboot基于Guava+自定义注解实现IP或自定义key限流 升级版
    Centos7设置默认进入图形界面和命令行界面
    第一节 RabbitMQ入门及安装
    第三节 Kafka性能优化实践
  • 原文地址:https://www.cnblogs.com/tkt2016/p/8727785.html
Copyright © 2011-2022 走看看