1、反射的作用 a、使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块 b、使用 Module 了解模块的程序集以及模块中的类的信息 c、使用 ConstructorInfo 了解类的构造函数的名称、参数、访问修饰符和实现的详细信息 d、使用 MethodInfo 了解方法的名称、返回类型、参数、访问修饰符和实现详细详细(abstract或virtual) e、使用 FieldInfo 了解方法的名称、访问修饰符和实现详细信息 f、使用 EventInfo 来了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型 g、使用 PRopertyInfo 来了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态 h、使用 ParameterInfo 来了解参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置
1、通过 AppDomain 对象的DefineDynamicAssembly 方法创建一个程序集框架
AppDomain domain = AppDomain.CurrentDomain;AssemblyName assemblyName = new AssemblyName();assemblyName.Name = "DynamicAssembly";AssemblyBuilder newAssembly = domain.DefineDynamicAssembly(assemblyName,AssemblyBuilderaccess.Run);ModuleBuilder newModule = newAssembly.DefineDynamicModule("SayHello");TypeBuilder classType = newModule.DefineType("MySayHello",TypeAttributes.Public);classType.IsClass = true;classType.AddInterfaceImplementation(typeof(ISayHello));Type[] paramTypes = new Type[0];Type returnType = typeof(int);MethodBuilder simpleMethod = classType.DefineMethod("SayHello",MethodAttributes.Public | MethodAttributes.Virtual,returnType,paramTypes);ILGenerator generator = simpleMethod.GetILGenerator();2、为方法添加代码
generator.Emit(OpCodes.Ldc_I4,1);//利用 Emit 方法直接写伪代码,将 1 压入堆栈generator.Emit(OpCodes.Ret);//返回栈顶元素generator.EmitWriteLine("Hello");//IL 写入方法 DeclareLocal、DefineLabel、EmitWriteLine3、将类型写入程序集
classType.CreateType();源代码元素的类型 | 代表性 CodeDOM 元素 |
---|---|
源代码文档或代码段 | CodeCompileUnit |
命名空间声明 | CodeNamespace |
命名空间声明集合 | CodeNamespaceCollection |
命名空间导入 | CodeNamespaceImport |
命名空间导入集合 | CodeNamespaceImportCollection |
类、结构或枚举的类型声明 | CodeTypeDeclaration |
类型声明集合 | CodeTypeDeclarationCollection |
类型成员的抽象基类 | CodeTypeMember |
类型成员集合 | CodeMemberMethod |
类字段声明 | CodeMemberField |
类属性声明 | CodeMemberProperty |
类型的构造函数 | CodeConstructor |
类型的静态构造函数 | CodeTypeConstructor |
程序入口点 | CodeEntryPoint |
CodeTypeMember 使用的标识符属性 | MemberAttributes |
对类型的引用 | CodeTypeReference |
对类型的引用集合 | CodeTypeReferenceCollection |
自定义属性声明 | CodeAttributeDeclaration |
自定义属性声明集合 | CodeAttributeDeclarationCollection |
参数声明 | CodeParameterDeclarationExpression |
参数声明集合 | CodeParameterDeclarationExpressionCollection |
自定义属性的参数 | CodeAttributeArgument |
自定义属性的参数集合 | CodeAttributeArgumentCollection |
方向表达式 | CodeDirectionExpression |
参数的方向 | FieldDirection |
语句的抽象基类 | CodeStatement |
代码语句集合 | CodeStatementCollection |
代码语句的代码表达式 | CodeExpressionStatement |
变量声明语句 | CodeVariableDeclarationStatement |
赋值语句 | CodeAssignStatement |
二元运算符表达式 | CodeBinaryOperatorExpression |
二元运算符的类型 | CodeBinaryOperatorType |
注释 | CodeStatement |
注释语句 | CodeCommentStatement |
注释语句集合 | CodeCommentStatementCollection |
类事件声明 | CodeMemberEvent |
委托声明 | CodeTypeDelegate |
创建委托的表达式 | CodeDelegateCreateExpression |
调用委托的表达式 | CodeDelegateInvokeExpression |
为事件附加委托的语句 | CodeAttachEventStatement |
throw 异常语句 | CodeThrowExceptionStatement |
try…catch…finally 代码块 | CodeTryCatchFinallyStatement |
catch 语句 | CodeCatchClause |
catch 语句块 | CodeCatchClauseCollection |
if 语句 | CodeConditionStatement |
for 循环语句 | CodeIterationStatement |
goto 语句 | CodeGotoStatement |
返回值语句 | CodeMethodReturnStatement |
标记语句 | CodeLabeledStatement |
表达式的抽象基类 | CodeExpression |
代码表达式集合 | CodeExpressionCollection |
将对象或表达式强制转换为数据类型的表达式 | CodeCastExpression |
基元值表达式 | CodePrimitiveExpression |
typeof 表达式 | CodeTypeOfExpression |
数组索引器 | CodeArrayIndexerExpression |
对参数的引用 | CodeArgumentReferenceExpression |
对变量的引用 | CodeVariableReferenceExpression |
引用类型的表达式 | CodeTypeReferenceExpression |
属性集的值参数表达式 | CodePropertySetValueReferenceExpression |
创建对象的表达式 | CodeObjectCreateExpression |
创建数组的表达式 | CodeArrayCreateExpression |
调用方法的表达式 | CodeMethodInvokeExpression |
类型索引器 | CodeIndexerExpression |
对基类的引用 | CodeBaseReferenceExpression |
对字段的引用 | CodeFieldReferenceExpression |
对方法的引用 | CodeMethodReferenceExpression |
对属性的引用 | CodePropertyReferenceExpression |
对事件的引用 | CodeEventReferenceExpression |
对当前对象的引用 | CodeThisReferenceExpression |
可编译的文件代码单元 | CodeSnippetCompileUnit |
类成员的文本元素 | CodeSnippetTypeMember |
表达式的文本代码元素 | CodeSnippetExpression |
CodeDOM 对象的抽象基类 | CodeObject |
表示包含文件名和行号的位置 | CodeLinePragma |
新闻热点
疑难解答