最近在写一个四层架构,遇到了一个瓶颈有关于asp.net高级反射,
动态生成的bean如何赋值问题?
首先,我查询数据库,得到所有的数据。并将所有的数据保存在DataTable中,
并把查询到的表结构传给getC(DataTable t),动态反射出bean之后,
返回动态生成的MyFirstClass类。源代码如下:
/// <summary>
/// GetC 构造Bean类
/// </summary>
/// <param name="d"></param>
/// <returns></returns>
public object GetC(DataTable d)
{
object objReturn;
FieldBuilder fieldBuilder = null;//类字段
PropertyBuilder propertyBuilder = null;//类属性
MethodAttributes getSetAttr;//指定方法属性的标志
MethodBuilder methodBuilder = null;//定义并表示动态的方法
ILGenerator ilGenerator = null;//生成Microsoft 中间语言 MSIL 指令
Type[] methodArgs ={ typeof(string) };//声明类型数组AssemblyName name = new AssemblyName();
name.Name = "MyFirstAssembly";AppDomain ad = System.Threading.Thread.GetDomain();
AssemblyBuilder abuilder = ad.DefineDynamicAssembly(name, AssemblyBuilderAccess.Run);ModuleBuilder mbuilder = abuilder.DefineDynamicModule("MyFirstModule");
TypeBuilder theClass = mbuilder.DefineType("MyFirstClass", TypeAttributes.Public | TypeAttributes.Class);
foreach (DataColumn dc in d.Columns)
{fieldBuilder = theClass.DefineField( dc.ColumnName, dc.DataType, FieldAttributes.Public);
propertyBuilder = theClass.DefineProperty(dc.ColumnName, System.Reflection.PropertyAttributes.HasDefault, dc.DataType, null);
getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig;methodBuilder = theClass.DefineMethod("get_" + dc.ColumnName, getSetAttr, typeof(string), Type.EmptyTypes);
ilGenerator = methodBuilder.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldfld, fieldBuilder);
ilGenerator.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(methodBuilder);methodBuilder = theClass.DefineMethod("set_" + dc.ColumnName,
MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.SpecialName,
typeof(void), methodArgs);
ilGenerator = methodBuilder.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldarg_1);
ilGenerator.Emit(OpCodes.Stfld, fieldBuilder);
ilGenerator.Emit(OpCodes.Ret);
propertyBuilder.SetSetMethod(methodBuilder);
}
Type ReturnClass = theClass.CreateType();//创建引用
objReturn = Activator.CreateInstance(ReturnClass);//创建实例化return objReturn;
}
关键问题就是我不知道如何赋值给它的set方法。找了好久还是想不通。
希望有哪位高手可以帮我解决一下,或给点解决的办法和建议。
在这里先谢谢了。
代码图片: