2023年12月14日发(作者:)

C#ClassHelper动态创建程序集和类,添加删除类属性

using System;

using c;

using tion;

using ;

using ing;

namespace DynamicTest

{

///

/// 类帮助器,可以动态对类,类成员进行控制(添加,删除),目前只支持属性控制。

/// 注意,属性以外的其它成员会被清空,功能还有待完善,使其不影响其它成员。

///

public class ClassHelper

{

#region 公有方法

///

/// 防止实例化。

///

private ClassHelper() { }

///

/// 根据类的类型创建类实例。

///

/// 将要创建的类型。

/// 返回创建的类实例。

public static object CreateInstance(Type t)

{

return Instance(t);

}

///

/// 根据类的名称,属性列表创建型实例。

///

/// 将要创建的类的名称。

/// 将要创建的类的属性列表。

/// 返回创建的类实例

public static object CreateInstance(string className, List lcpi)

{

Type t = BuildType(className);

t = AddProperty(t, lcpi);

return Instance(t);

}

///

/// 根据属性列表创建类的实例,默认类名为DefaultClass,由于生成的类不是强类型,所以类名可以忽略。

///

/// 将要创建的类的属性列表

/// 返回创建的类的实例。

public static object CreateInstance(List lcpi)

{

return CreateInstance("DefaultClass", lcpi);

}

///

/// 根据类的实例设置类的属性。

///

/// 将要设置的类的实例。

/// 将要设置属性名。

/// 将要设置属性值。

public static void SetPropertyValue(object classInstance, string propertyName, object propertSetValue)

{

e().InvokeMember(propertyName, perty,

null, classInstance, new object[] { Type(propertSetValue, e()) });

}

///

/// 根据类的实例获取类的属性。

///

/// 将要获取的类的实例

/// 将要设置的属性名。

/// 返回获取的类的属性。

public static object GetPropertyValue(object classInstance, string propertyName)

{

return e().InvokeMember(propertyName, perty,

null, classInstance, new object[] { });

}

///

/// 创建一个没有成员的类型的实例,类名为"DefaultClass"。

///

/// 返回创建的类型的实例。

public static Type BuildType()

{

return BuildType("DefaultClass");

}

///

/// 根据类名创建一个没有成员的类型的实例。

///

/// 将要创建的类型的实例的类名。

/// 返回创建的类型的实例。

public static Type BuildType(string className)

{

AppDomain myDomain = ain();

AssemblyName myAsmName = new AssemblyName();

= "MyDynamicAssembly";

//创建一个永久程序集,设置为Save。

AssemblyBuilder myAsmBuilder = DynamicAssembly(myAsmName, Save);

//创建一个永久单模程序块。

ModuleBuilder myModBuilder = DynamicModule(, + ".dll");

//创建TypeBuilder。

TypeBuilder myTypeBuilder = Type(className, );

//创建类型。

Type retval = Type();

//保存程序集,以便可以被解析,或被测试程序引用。

//( + ".dll");

return retval;

}

///

/// 添加属性到类型的实例,注意:该操作会将其它成员清除掉,其功能有待完善。

///

/// 指定类型的实例。

/// 表示属性的一个列表。

/// 返回处理过的类型的实例。

public static Type AddProperty(Type classType, List lcpi)

{

//合并先前的属性,以便一起在下一步进行处理。

MergeProperty(classType, lcpi);

//把属性加入到Type。

return AddPropertyToType(classType, lcpi);

}

///

/// 添加属性到类型的实例,注意:该操作会将其它成员清除掉,其功能有待完善。

///

/// 指定类型的实例。

/// 表示一个属性。

/// 返回处理过的类型的实例。

public static Type AddProperty(Type classType, CustPropertyInfo cpi)

{

List lcpi = new List();

(cpi);

//合并先前的属性,以便一起在下一步进行处理。

MergeProperty(classType, lcpi);

//把属性加入到Type。

return AddPropertyToType(classType, lcpi);

}

///

/// 从类型的实例中移除属性,注意:该操作会将其它成员清除掉,其功能有待完善。

///

/// 指定类型的实例。

/// 要移除的属性。

/// 返回处理过的类型的实例。

public static Type DeleteProperty(Type classType, string propertyName)

{

List ls = new List();

(propertyName);

//合并先前的属性,以便一起在下一步进行处理。

List lcpi = SeparateProperty(classType, ls);

//把属性加入到Type。

return AddPropertyToType(classType, lcpi);

}

///

/// 从类型的实例中移除属性,注意:该操作会将其它成员清除掉,其功能有待完善。

///

/// 指定类型的实例。

/// 要移除的属性列表。

/// 返回处理过的类型的实例。

public static Type DeleteProperty(Type classType, List ls)

{

//合并先前的属性,以便一起在下一步进行处理。

List lcpi = SeparateProperty(classType, ls);

//把属性加入到Type。

return AddPropertyToType(classType, lcpi);

}

#endregion

#region 私有方法

///

/// 把类型的实例t和lcpi参数里的属性进行合并。

///

/// 实例t

/// 里面包含属性列表的信息。

private static void MergeProperty(Type t, List lcpi)

{

foreach (PropertyInfo pi in perties())

{

CustPropertyInfo cpi = new CustPropertyInfo(me, );

(cpi);

}

}

///

/// 从类型的实例t的属性移除属性列表lcpi,返回的新属性列表在lcpi中。

///

/// 类型的实例t。

/// 要移除的属性列表。

private static List SeparateProperty(Type t, List ls)

{

List ret = new List();

foreach (PropertyInfo pi in perties())

{

foreach (string s in ls)

{

if ( != s)

{

CustPropertyInfo cpi = new CustPropertyInfo(me, );

(cpi);

}

}

}

return ret;

}

///

/// 把lcpi参数里的属性加入到myTypeBuilder中。注意:该操作会将其它成员清除掉,其功能有待完善。

///

/// 类型构造器的实例。

/// 里面包含属性列表的信息。

private static void AddPropertyToTypeBuilder(TypeBuilder myTypeBuilder, List lcpi)

{

PropertyBuilder custNamePropBldr;

MethodBuilder custNameGetPropMthdBldr;

MethodBuilder custNameSetPropMthdBldr;

MethodAttributes getSetAttr;

ILGenerator custNameGetIL;

ILGenerator custNameSetIL;

// 属性Set和Get方法要一个专门的属性。这里设置为Public。

getSetAttr = | lName | Sig;

// 添加属性到myTypeBuilder。

foreach (CustPropertyInfo cpi in lcpi)

{

//定义字段。

FieldBuilder customerNameBldr = Field(ame, e(), e);

stant("11111111");

//定义属性。

//最后一个参数为null,因为属性没有参数。

custNamePropBldr = Property(tyName, ault, e(), null);

stant("111111111");

//定义Get方法。

custNameGetPropMthdBldr = Method(pertyMethodName, getSetAttr, e(), ypes);

custNameGetIL = enerator();

try {

(_0);

//(, customerNameBldr);

(, customerNameBldr);

();

}

catch (Exception ex)

{

ine(e);

}

//定义Set方法。

custNameSetPropMthdBldr =

Method(pertyMethodName, getSetAttr, null, new Type[] { e() });

custNameSetIL = enerator();

(_0);

(_1);

(, customerNameBldr);

();

//stant("ceshi");

//把创建的两个方法(Get,Set)加入到PropertyBuilder中。

Method(custNameGetPropMthdBldr);

Method(custNameSetPropMthdBldr);

}

}

///

/// 把属性加入到类型的实例。

///

/// 类型的实例。

/// 要加入的属性列表。

/// 返回处理过的类型的实例。

public static Type AddPropertyToType(Type classType, List lcpi)

{

AppDomain myDomain = ain();

AssemblyName myAsmName = new AssemblyName();

= "MyDynamicAssembly";

//创建一个永久程序集,设置为Save。

AssemblyBuilder myAsmBuilder = DynamicAssembly(myAsmName, Save);

//创建一个永久单模程序块。

ModuleBuilder myModBuilder = DynamicModule(, + ".dll");

//创建TypeBuilder。

TypeBuilder myTypeBuilder = Type(me, );

//把lcpi中定义的属性加入到TypeBuilder。将清空其它的成员。其功能有待扩展,使其不影响其它成员。

AddPropertyToTypeBuilder(myTypeBuilder, lcpi);

//创建类型。

Type retval = Type();

//保存程序集,以便可以被解析,或被测试程序引用。

//( + ".dll");

return retval;

}

#endregion

#region 辅助类

///

/// 自定义的属性信息类型。

///

public class CustPropertyInfo

{

private string propertyName;

private string type;

///

/// 空构造。

///

public CustPropertyInfo() { }

///

/// 根据属性类型名称,属性名称构造实例。

///

/// 属性类型名称。

/// 属性名称。

public CustPropertyInfo(string type, string propertyName)

{

= type;

tyName = propertyName;

} ///

/// 获取或设置属性类型名称。

///

public string Type

{

get { return type; }

set { type = value; }

}

///

/// 获取或设置属性名称。

///

public string PropertyName

{

get { return propertyName; }

set { propertyName = value; }

}

///

/// 获取属性字段名称。

///

public string FieldName

{

get

{

if ( < 1) return "";

return ing(0, 1).ToLower() + ing(1);

}

}

///

/// 获取属性在IL中的Set方法名。

///

public string SetPropertyMethodName

{

get { return "set_" + PropertyName; }

}

///

/// 获取属性在IL中的Get方法名。

///

public string GetPropertyMethodName

{

get { return "get_" + PropertyName; }

}

}

#endregion

}

}