您的位置:首页 > 编程语言 > ASP

asp.net高级反射,动态生成的bean如何处理赋值问题?

2007-11-22 11:04 681 查看

最近在写一个四层架构,遇到了一个瓶颈有关于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方法。找了好久还是想不通。
希望有哪位高手可以帮我解决一下,或给点解决的办法和建议。
在这里先谢谢了。
代码图片:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐