1、反射的作用 a、使用 Assembly 定義和加載程序集,加載在程序集清單中列出的模塊 b、使用 Module 了解模塊的程序集以及模塊中的類的信息 c、使用 ConstructorInfo 了解類的構(gòu)造函數(shù)的名稱、參數(shù)、訪問修飾符和實(shí)現(xiàn)的詳細(xì)信息 d、使用 MethodInfo 了解方法的名稱、返回類型、參數(shù)、訪問修飾符和實(shí)現(xiàn)詳細(xì)詳細(xì)(abstract或virtual) e、使用 FieldInfo 了解方法的名稱、訪問修飾符和實(shí)現(xiàn)詳細(xì)信息 f、使用 EventInfo 來了解事件的名稱、事件處理程序數(shù)據(jù)類型、自定義屬性、聲明類型和反射類型 g、使用 PRopertyInfo 來了解屬性的名稱、數(shù)據(jù)類型、聲明類型、反射類型和只讀或可寫狀態(tài) h、使用 ParameterInfo 來了解參數(shù)的名稱、數(shù)據(jù)類型、參數(shù)是輸入?yún)?shù)還是輸出參數(shù),以及參數(shù)在方法簽名中的位置
1、通過 AppDomain 對象的DefineDynamicAssembly 方法創(chuàng)建一個程序集框架
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 |
| 命名空間導(dǎo)入 | CodeNamespaceImport |
| 命名空間導(dǎo)入集合 | CodeNamespaceImportCollection |
| 類、結(jié)構(gòu)或枚舉的類型聲明 | CodeTypeDeclaration |
| 類型聲明集合 | CodeTypeDeclarationCollection |
| 類型成員的抽象基類 | CodeTypeMember |
| 類型成員集合 | CodeMemberMethod |
| 類字段聲明 | CodeMemberField |
| 類屬性聲明 | CodeMemberProperty |
| 類型的構(gòu)造函數(shù) | CodeConstructor |
| 類型的靜態(tài)構(gòu)造函數(shù) | CodeTypeConstructor |
| 程序入口點(diǎn) | CodeEntryPoint |
| CodeTypeMember 使用的標(biāo)識符屬性 | MemberAttributes |
| 對類型的引用 | CodeTypeReference |
| 對類型的引用集合 | CodeTypeReferenceCollection |
| 自定義屬性聲明 | CodeAttributeDeclaration |
| 自定義屬性聲明集合 | CodeAttributeDeclarationCollection |
| 參數(shù)聲明 | CodeParameterDeclarationExpression |
| 參數(shù)聲明集合 | CodeParameterDeclarationExpressionCollection |
| 自定義屬性的參數(shù) | CodeAttributeArgument |
| 自定義屬性的參數(shù)集合 | CodeAttributeArgumentCollection |
| 方向表達(dá)式 | CodeDirectionExpression |
| 參數(shù)的方向 | FieldDirection |
| 語句的抽象基類 | CodeStatement |
| 代碼語句集合 | CodeStatementCollection |
| 代碼語句的代碼表達(dá)式 | CodeExpressionStatement |
| 變量聲明語句 | CodeVariableDeclarationStatement |
| 賦值語句 | CodeAssignStatement |
| 二元運(yùn)算符表達(dá)式 | CodeBinaryOperatorExpression |
| 二元運(yùn)算符的類型 | CodeBinaryOperatorType |
| 注釋 | CodeStatement |
| 注釋語句 | CodeCommentStatement |
| 注釋語句集合 | CodeCommentStatementCollection |
| 類事件聲明 | CodeMemberEvent |
| 委托聲明 | CodeTypeDelegate |
| 創(chuàng)建委托的表達(dá)式 | CodeDelegateCreateExpression |
| 調(diào)用委托的表達(dá)式 | CodeDelegateInvokeExpression |
| 為事件附加委托的語句 | CodeAttachEventStatement |
| throw 異常語句 | CodeThrowExceptionStatement |
| try…catch…finally 代碼塊 | CodeTryCatchFinallyStatement |
| catch 語句 | CodeCatchClause |
| catch 語句塊 | CodeCatchClauseCollection |
| if 語句 | CodeConditionStatement |
| for 循環(huán)語句 | CodeIterationStatement |
| goto 語句 | CodeGotoStatement |
| 返回值語句 | CodeMethodReturnStatement |
| 標(biāo)記語句 | CodeLabeledStatement |
| 表達(dá)式的抽象基類 | CodeExpression |
| 代碼表達(dá)式集合 | CodeExpressionCollection |
| 將對象或表達(dá)式強(qiáng)制轉(zhuǎn)換為數(shù)據(jù)類型的表達(dá)式 | CodeCastExpression |
| 基元值表達(dá)式 | CodePrimitiveExpression |
| typeof 表達(dá)式 | CodeTypeOfExpression |
| 數(shù)組索引器 | CodeArrayIndexerExpression |
| 對參數(shù)的引用 | CodeArgumentReferenceExpression |
| 對變量的引用 | CodeVariableReferenceExpression |
| 引用類型的表達(dá)式 | CodeTypeReferenceExpression |
| 屬性集的值參數(shù)表達(dá)式 | CodePropertySetValueReferenceExpression |
| 創(chuàng)建對象的表達(dá)式 | CodeObjectCreateExpression |
| 創(chuàng)建數(shù)組的表達(dá)式 | CodeArrayCreateExpression |
| 調(diào)用方法的表達(dá)式 | CodeMethodInvokeExpression |
| 類型索引器 | CodeIndexerExpression |
| 對基類的引用 | CodeBaseReferenceExpression |
| 對字段的引用 | CodeFieldReferenceExpression |
| 對方法的引用 | CodeMethodReferenceExpression |
| 對屬性的引用 | CodePropertyReferenceExpression |
| 對事件的引用 | CodeEventReferenceExpression |
| 對當(dāng)前對象的引用 | CodeThisReferenceExpression |
| 可編譯的文件代碼單元 | CodeSnippetCompileUnit |
| 類成員的文本元素 | CodeSnippetTypeMember |
| 表達(dá)式的文本代碼元素 | CodeSnippetExpression |
| CodeDOM 對象的抽象基類 | CodeObject |
| 表示包含文件名和行號的位置 | CodeLinePragma |
新聞熱點(diǎn)
疑難解答