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& |