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)
疑難解答
圖片精選