快捷搜索:

C#动态创建和动态使用程序集、类、方法、字段等

上一节讲了若何动态的创建,这一节就要讲创建了我们必要若何应用了,这当然也是异常紧张的, 是吧。创建了动态类型然则又不应用,那创建它有什么用了。呵呵,本日我们就来一路进修动态应用动态创建的类型。

当然我们跟上一章一样要对这些动态类型的应用类型进行一些懂得。

类:应用System.Type(任何时刻都是反射出类型进行应用,难道不是吗?)

构造函数:System.Reflection.ConstructorInfo(发明类构造函数的属性并供给对构造函数元数据的造访权)

事故:System.Reflection.EventInfo(发明事故的属性并供给对事故元数据的造访权)

字段:System.Reflection.FieldInfo(发明字段属性并供给对字段元数据的造访权)

措施:System.Reflection.MemberInfo(获取有关成员属性的信息并供给对成员元数据的造访)

成员:System.Reflection.MemberInfo(获取有关成员属性的信息并供给对成员元数据的造访)

参数:System.Reflection.ParameterInfo(发明参数属性并供给对参数元数据的造访)

属性:System.Reflection.PropertyInfo (发明属性 (Property) 的属性 (Attribute) 并供给对属性 (Property) 元数据的造访)

同样这是一种延伸涉猎,只是先对这些进行懂得,假如不知道的话,可能对动态的应用类型就无法下手了。

本日我做了一个Demo,先上Demo吧,然后在来解释法度榜样是若何履行的。

/动态创建的动态类型

public static Type DynamicCreateType()

{

//动态创建法度榜样集

AssemblyName DemoName = new AssemblyName("DynamicAssembly");

AssemblyBuilder dynamicAssembly = AppDomain.CurrentDomain.DefineDynamicAssembly(DemoName, AssemblyBuilderAccess.RunAndSave);

//动态创建模块

ModuleBuilder mb = dynamicAssembly.DefineDynamicModule(DemoName.Name, DemoName.Name".dll");

//动态创建类MyClass

TypeBuilder tb = mb.DefineType("MyClass", TypeAttributes.Public);

//动态创建字段

FieldBuilder fb = tb.DefineField("myField", typeof(System.String), FieldAttributes.Private);

//动态创建构造函数

Type[] clorType = new Type[] { typeof(System.String) };

ConstructorBuilder cb1 = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, clorType);

//天生指令

ILGenerator ilg = cb1.GetILGenerator();//天生 Microsoft 中心说话 (MSIL) 指令

ilg.Emit(OpCodes.Ldarg_0);

ilg.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes));

ilg.Emit(OpCodes.Ldarg_0);

ilg.Emit(OpCodes.Ldarg_1);

ilg.Emit(OpCodes.Stfld, fb);

ilg.Emit(OpCodes.Ret);

//动态创建属性

PropertyBuilder pb = tb.DefineProperty("MyProperty", PropertyAttributes.HasDefault, typeof(string), null);

//动态创建措施

MethodAttributes getSetAttr = MethodAttributes.Public | MethodAttributes.SpecialName;

MethodBuilder myMethod = tb.DefineMethod("get_Field", getSetAttr, typeof(string), Type.EmptyTypes);

//天生指令

ILGenerator numberGetIL = myMethod.GetILGenerator();

numberGetIL.Emit(OpCodes.Ldarg_0);

numberGetIL.Emit(OpCodes.Ldfld, fb);

numberGetIL.Emit(OpCodes.Ret);

//应用动态类创建类型

Type classType = tb.CreateType();

//保存动态创建的法度榜样集 (法度榜样集将保存在法度榜样目录下调试时就在Debug下)

dynamicAssembly.Save(DemoName.Name".dll");

//创建类

return classType;

}

您可能还会对下面的文章感兴趣: