c# emit 动态实现接口
using System;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit; namespace TestEmit{ public interface IPerson{
void SayHello(); } class Person2 {
public void SayHello() { Console.WriteLine("i am person2");
}
} class Test2
{
static void Main(string[] args)
{
IPerson p = (IPerson)CreateType();
p.SayHello(); Console.ReadLine();
} public static object CreateType()
{
AssemblyName assemblyName = new AssemblyName("assemblyName");
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("PersonModule", "Person.dll");
TypeBuilder typeBuilder = moduleBuilder.DefineType("Person", TypeAttributes.Public);
//*添加所实现的接口
typeBuilder.AddInterfaceImplementation(typeof(IPerson)); //实现方法
MethodBuilder mbIM = typeBuilder.DefineMethod("SayHello",
MethodAttributes.Public | MethodAttributes.HideBySig |
MethodAttributes.NewSlot | MethodAttributes.Virtual |
MethodAttributes.Final,
null,
Type.EmptyTypes); ILGenerator il = mbIM.GetILGenerator();
il.Emit(OpCodes.Ldstr, "The SayHello implementation of IPerson");
il.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine",
new Type[] { typeof(string) }));
il.Emit(OpCodes.Ret);
typeBuilder.DefineMethodOverride(mbIM, typeof(IPerson).GetMethod("SayHello"));
//添加方法
//MethodBuilder sayHelloMethod = typeBuilder.DefineMethod("SayHello", MethodAttributes.Public, null, null); //ILGenerator ilOfSayHello = sayHelloMethod.GetILGenerator();
//ilOfSayHello.Emit(OpCodes.Ldstr, "蝈蝈");
//ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
//ilOfSayHello.Emit(OpCodes.Call, typeof(Console).GetMethod("ReadLine"));
////没有返回值所有加OpCodes.Pop
//ilOfSayHello.Emit(OpCodes.Pop);
//ilOfSayHello.Emit(OpCodes.Ret);
Type personType = typeBuilder.CreateType();
assemblyBuilder.Save("Person.dll");
object obj = Activator.CreateInstance(personType);
MethodInfo methodInfo = personType.GetMethod("SayHello"); methodInfo.Invoke(obj, null);
return Activator.CreateInstance(personType);
} } }
c# emit 动态实现接口的更多相关文章
- C# Emit动态代理生成一个实体对象
/// <summary> /// 使用Emit动态代理收集实体信息 /// </summary> /// <typeparam name="T"&g ...
- 秒懂C#通过Emit动态生成代码 C#使用Emit构造拦截器动态代理类
秒懂C#通过Emit动态生成代码 首先需要声明一个程序集名称, 1 // specify a new assembly name 2 var assemblyName = new Assembly ...
- Java EE开发平台随手记5——Mybatis动态代理接口方式的原生用法
为了说明后续的Mybatis扩展,插播一篇广告,先来简要说明一下Mybatis的一种原生用法,不过先声明:下面说的只是Mybatis的其中一种用法,如需要更深入了解Mybatis,请参考官方文档,或者 ...
- Emit动态生成代码
Emit动态生成代码 引用:秒懂C#通过Emit动态生成代码 首先需要声明一个程序集名称, // specify a new assembly name var assemblyName = new ...
- React和动态网站接口的经济学
来自: React and the economics of dynamic web interfaces 自从2000开始我就一直在做web开发,曾见过很多以各种库和框架的起起落落,这些库和框架作为 ...
- Emit动态代理.NetCore迁移之旅
[前言] 前面我们介绍了Aop 从静态代理到动态代理:https://www.cnblogs.com/7tiny/p/9657451.html 我们在.NetFramework平台下使用微软提供的Em ...
- Emit动态生成代理类用于监控对象的字段修改
利用Emit动态生成代理对象监控对象哪些字段被修改,被修改为什么值 被Register的对象要监控的值必须是Virtual虚类型 必须使用CreateInstance创建对象 必须使用DynamicP ...
- .Net Core JWT 动态设置接口与权限
通过上一篇.Net Core官方的 JWT 授权验证学习到了JWT的授权.可以发现一个问题,就是如果每个接口可以使用的角色都是写死的,这样如果有所修改会非常麻烦,虽然用policy可以一定程度上缓解, ...
- C#动态创建接口的实现实例对象
本文简单介绍如何动态创建接口interface的实现实例对象,包含两个知识点: 1.如何获取接口interface的所有实现实例对象? 2.如何判断实例对象的构造函数是否有参数? 准备工作 首先新建一 ...
随机推荐
- Lis(bzoj 3532)
Description 给定序列A,序列中的每一项Ai有删除代价Bi和附加属性Ci.请删除若干项,使得4的最长上升子序列长度减少至少1,且付出的代价之和最小,并输出方案. 如果有多种方案,请输出 ...
- 大陆争霸(bzoj 1922)
Description 在一个遥远的世界里有两个国家:位于大陆西端的杰森国和位于大陆东端的 克里斯国.两个国家的人民分别信仰两个对立的神:杰森国信仰象征黑暗和毁灭 的神曾·布拉泽,而克里斯国信仰象征光 ...
- HDU 5869.Different GCD Subarray Query-区间gcd+树状数组 (神奇的标记右移操作) (2016年ICPC大连网络赛)
树状数组... Different GCD Subarray Query Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/6 ...
- webservice原理及基于cxf开发的基本流程
一.SOA和webservice SOA(service-Oriented Architecture)是面向服务的架构,是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的 ...
- webpack学习(一)安装和命令行、一次js/css的打包体验及不同版本错误
一.前言 找了一个视频教程开始学习webpack,跟着视频学习,在自己的实际操作中发现,出现了很多问题.基本上都是因为版本的原因而导致,自己看的视频是基于webpack 1.x版,而自己现在早已是we ...
- php 经验之谈
导出excel中文名乱码(保存文件名): hpexcel导出Excel文件时有两个主要的过程: 1.定义文件名 2.填充Excel数据 这两个过程中可能会出现一些乱码问题,下面我来说一下解决办法: 解 ...
- 审查php.ini自动分析程序
源码 https://github.com/sektioneins/pcc 使用方法 环境: mac cli 命令行执行 git clone https://github.com/sektionein ...
- Docker镜像原理和最佳实践
https://yq.aliyun.com/articles/68477 https://yq.aliyun.com/articles/57126 DockerCon 2016 深度解读: Dock ...
- Linux命令大总结
from http://elain.blog.51cto.com/3339379/623310 Linux命令大总结------------------------------------------ ...
- centos7设置系统语言为中文
centos7设置系统语言为中文 修改 /etc/locale.conf 文件内容为: LANG="zh_CN.GB18030" LANGUAGE="zh_CN.GB1 ...