PDA

View Full Version : RunTime Class



negar_s80
شنبه 19 اسفند 1391, 13:49 عصر
سلام و خسته نباشيد من با استفاده از متد زير كلاس و Property هاي اون رو به صورت RunTime ايجاد كردم حالا مي خوام از اين كلاس به صورت BindingList<T> استفاده كنم يعني به جاي T كلاسي كه اكنون ساخته شده است . كسي مي تونه كمكم كنه ؟

public static Type BuildDynamicTypeWithProperties()
{
AppDomain myDomain = Thread.GetDomain();
AssemblyName myAsmName = new AssemblyName();
myAsmName.Name = "TestBed";

AssemblyBuilder myAsmBuilder = myDomain.DefineDynamicAssembly(myAsmName,
AssemblyBuilderAccess.Run);
ModuleBuilder myModBuilder = myAsmBuilder.DefineDynamicModule("PropertyBuilderDemo");

TypeBuilder myTypeBuilder = myModBuilder.DefineType("CustomerData",
TypeAttributes.Public);

FieldBuilder customerNameBldr = myTypeBuilder.DefineField("customerName",
typeof(string),
FieldAttributes.Private);

PropertyBuilder custNamePropBldr =
myTypeBuilder.DefineProperty("CustomerName",
PropertyAttributes.HasDefault,
typeof(string),
new Type[] { typeof(string) });

Type[] ctorParams;
ConstructorInfo classCtorInfo;

CustomAttributeBuilder myCABuilder;

// Add DescriptionAttribute
ctorParams = new Type[] { typeof(string) };
classCtorInfo =
typeof(DescriptionAttribute).GetConstructor(ctorPa rams);
myCABuilder = new CustomAttributeBuilder(
classCtorInfo,
new object[] { "DescriptionAttribute" });
custNamePropBldr.SetCustomAttribute(myCABuilder);

// Add TestAttribute
ctorParams = new Type[] { typeof(string) };
classCtorInfo =
typeof(TestAttribute).GetConstructor(ctorParams);
myCABuilder = new CustomAttributeBuilder(
classCtorInfo,
new object[] { "TestAttribute" });
custNamePropBldr.SetCustomAttribute(myCABuilder);

// First, we'll define the behavior of the "get" property for CustomerName as a method.
MethodBuilder custNameGetPropMthdBldr =
myTypeBuilder.DefineMethod("GetCustomerName",
MethodAttributes.Public,
typeof(string),
new Type[] { });

ILGenerator custNameGetIL = custNameGetPropMthdBldr.GetILGenerator();

custNameGetIL.Emit(OpCodes.Ldarg_0);
custNameGetIL.Emit(OpCodes.Ldfld, customerNameBldr);
custNameGetIL.Emit(OpCodes.Ret);

// Now, we'll define the behavior of the "set" property for CustomerName.
MethodBuilder custNameSetPropMthdBldr =
myTypeBuilder.DefineMethod("SetCustomerName",
MethodAttributes.Public,
null,
new Type[] { typeof(string) });

ILGenerator custNameSetIL = custNameSetPropMthdBldr.GetILGenerator();

custNameSetIL.Emit(OpCodes.Ldarg_0);
custNameSetIL.Emit(OpCodes.Ldarg_1);
custNameSetIL.Emit(OpCodes.Stfld, customerNameBldr);
custNameSetIL.Emit(OpCodes.Ret);

// Last, we must map the two methods created above to our PropertyBuilder to
// their corresponding behaviors, "get" and "set" respectively.
custNamePropBldr.SetGetMethod(custNameGetPropMthdB ldr);
custNamePropBldr.SetSetMethod(custNameSetPropMthdB ldr);

return myTypeBuilder.CreateType();
}