设为首页 加入收藏

TOP

动态建立类(三)
2017-10-10 12:31:57 】 浏览:1795
Tags:动态 建立
Codes.Stfld, customerNameBldr); custNameSetIL.Emit(OpCodes.Ret);
//把创建的两个方法(Get,Set)加入到PropertyBuilder中。 custNamePropBldr.SetGetMethod(custNameGetPropMthdBldr); custNamePropBldr.SetSetMethod(custNameSetPropMthdBldr); } } /// <summary> /// 把属性加入到类型的实例。 /// </summary> /// <param name="classType">类型的实例。</param> /// <param name="lcpi">要加入的属性列表。</param> /// <returns>返回处理过的类型的实例。</returns> public static Type SetObjectAndAddPropertyToType(string name, List<CustPropertyInfo> lcpi) { AppDomain myDomain = Thread.GetDomain(); AssemblyName myAsmName = new AssemblyName(); myAsmName.Name = "DynamicAssembly"; //创建一个永久程序集,设置为AssemblyBuilderAccess.RunAndSave。 AssemblyBuilder myAsmBuilder = myDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.RunAndSave); //创建一个永久单模程序块。 ModuleBuilder myModBuilder = myAsmBuilder.DefineDynamicModule(myAsmName.Name, myAsmName.Name + ".dll"); //创建TypeBuilder。 TypeBuilder myTypeBuilder = myModBuilder.DefineType(name, TypeAttributes.Public); //把lcpi中定义的属性加入到TypeBuilder。将清空其它的成员。其功能有待扩展,使其不影响其它成员。 AddPropertyToTypeBuilder(myTypeBuilder, lcpi);//创建类型。 Type retval = myTypeBuilder.CreateType(); //保存程序集,以便可以被Ildasm.exe解析,或被测试程序引用。 myAsmBuilder.Save(myAsmName.Name + ".dll"); return retval; } #endregion // 辅助类 #region 辅助类 /// <summary> /// 自定义的属性信息类型。 /// </summary> public class CustPropertyInfo { private string propertyName; private Type type; private string attributeName; /// <summary> /// 空构造。 /// </summary> public CustPropertyInfo() { } /// <summary> /// 根据属性类型名称,属性名称构造实例。 /// </summary> /// <param name="type">属性类型名称。</param> /// <param name="propertyName">属性名称。</param> public CustPropertyInfo(Type type, string propertyName) { this.type = type; this.propertyName = propertyName; } /// <summary> /// 根据属性类型名称,属性名称构造实例。 /// </summary> /// <param name="type">属性类型名称。</param> /// <param name="propertyName">属性名称。</param> /// <param name="attributeName">描述特性值</param> public CustPropertyInfo(Type type, string propertyName, string attributeName) { this.type = type; this.propertyName = propertyName; this.attributeName = attributeName; } /// <summary> /// 获取或设置属性类型名称。 /// </summary> public Type Type { get { return type; } set { type = value; } } /// <summary> /// 获取或设置属性名称。 /// </summary> public string PropertyName { get { return propertyName; } set { propertyName = value; } } /// <summary> /// 获取或设置特性名称 /// </summary> public string AttributeName { get { return attributeName; } set { attributeName = value; } } /// <summary> /// 获取属性字段名称。 /// </summary> public string FieldName { get { return $"_{ propertyName.Substring(0, 1).ToLower()} {propertyName.Substring(1)}"; } } /// <summary> /// 获取属性在IL中的Set方法名。 /// </summary> public string SetPropertyMethodName { get { return "set_" + PropertyName; } } /// <summary> /// 获取属性在IL中的Get方法名。 /// </summary&
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇从Redis生成数据表主键标识 下一篇Thread.Join 和 Task.Wait 方法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目