最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
通过Emit实现动态类生成
时间:2022-07-02 11:33:40 编辑:袖梨 来源:一聚教程网
动态生成一个类对于AOP,O/R Mapping等技术非常有帮助。对于Java来说,问题不大,而对于.NET,则要麻烦些(主要麻烦在于实现代码的生成需要IL),故猜测这可能也是在AOP, O/R Mapping方面,Java走得略前的原因吧。
麻烦归麻烦,非不能也,动态生成一个简单的类还不至于太难。
假设有如下接口:
interface IAnimal
{
void move();
void eat();
}
希望能创建一个类生成器TypeCreator,并能以以下方式使用:
TypeCreator tc=new TypeCreator(typeof(IAnimal));
Type t = tc.build();
IAnimal myAnimal= (IAnimal)Activator.CreateInstance(t);
myAnimal.move();
myAnimal.eat();
首先,发现System.Reflection.Emit.TypeBuilder似乎就是一个现成的类生成器。
不过TypeBuilder既没有实用的static方法,也不能在外部实例化。不过ModuleBuilder倒有一个DefineType()方法,可以得到TypeBuilder;而ModuleBuilder和TyperBuilder一个德行,不能直接创建,得从AssemblyBuilder的DefineDynamicModule()方法得到。追根溯源,AssemblyBuilder得从AppDomain的DefineDynamicAssembly()的得来。最终好在AppDomain提供了一个静态方法:AppDomain.CurrentDomain. 这一连串并非没有道理,类型是依附于Module的,而Module依附于Assembly,而Assembly则被AppDomain装载。所谓“皮之不存,毛将焉附”,为了创建Type这个“毛”,得先把Assembly,Module这些“皮”依次构造出来:
using System;
using System.Reflection;
using System.Reflection.Emit;
public class TypeCreator
{
private Type targetType;
///
/// 构造函数
///
/// 被实现或者继承的类型
public TypeCreator(Type targetType)
麻烦归麻烦,非不能也,动态生成一个简单的类还不至于太难。
假设有如下接口:
interface IAnimal
{
void move();
void eat();
}
希望能创建一个类生成器TypeCreator,并能以以下方式使用:
TypeCreator tc=new TypeCreator(typeof(IAnimal));
Type t = tc.build();
IAnimal myAnimal= (IAnimal)Activator.CreateInstance(t);
myAnimal.move();
myAnimal.eat();
首先,发现System.Reflection.Emit.TypeBuilder似乎就是一个现成的类生成器。
不过TypeBuilder既没有实用的static方法,也不能在外部实例化。不过ModuleBuilder倒有一个DefineType()方法,可以得到TypeBuilder;而ModuleBuilder和TyperBuilder一个德行,不能直接创建,得从AssemblyBuilder的DefineDynamicModule()方法得到。追根溯源,AssemblyBuilder得从AppDomain的DefineDynamicAssembly()的得来。最终好在AppDomain提供了一个静态方法:AppDomain.CurrentDomain. 这一连串并非没有道理,类型是依附于Module的,而Module依附于Assembly,而Assembly则被AppDomain装载。所谓“皮之不存,毛将焉附”,为了创建Type这个“毛”,得先把Assembly,Module这些“皮”依次构造出来:
using System;
using System.Reflection;
using System.Reflection.Emit;
public class TypeCreator
{
private Type targetType;
///
/// 构造函数
///
/// 被实现或者继承的类型
public TypeCreator(Type targetType)
相关文章
- 《无限暖暖》天星之羽获得位置介绍 12-20
- 《流放之路2》重铸台解锁方法介绍 12-20
- 《无限暖暖》瞄准那个亮亮的成就怎么做 12-20
- 《无限暖暖》魔气怪终结者完成方法 12-20
- 《无限暖暖》曙光毛团获得位置介绍 12-20
- 《无限暖暖》日光果获得位置介绍 12-20