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 |
新聞熱點
疑難解答