可以用來做視頻網(wǎng)站的視頻外鏈嗎網(wǎng)絡(luò)營銷專員的就業(yè)前景
前言
反射使用,讓我們的程序可以動態(tài)增加一些功能,讓原本固化的步驟邏輯變得動態(tài),這是它的優(yōu)點。當(dāng)然使用反射首次加載會有性能損耗以及使用復(fù)雜;但是現(xiàn)在大家都在講動態(tài),使用好它應(yīng)該是一個重要的編程理念提升。MVC、ORM、IOC、AOPA都有使用這個東西了。如果要考慮性能,可以考慮緩存程序集,我們保證程序只加載一次就好。
一、直接利用反射讀寫對象的值
static void Main(string[] args){Person p = new Person() { Name = "丁竹", Age = 26, Sex = true };p.Working("readinof");//利用反射讀取值object obj = p;var type = obj.GetType();foreach (var item in type.GetProperties()){string value = item.GetValue(obj, null).ToString();Console.WriteLine($"{item.Name} {value}");}Assembly ass = Assembly.Load("ReadInfo");object pObj = ass.CreateInstance("ReadInfo.Person");//利用反射設(shè)置值{System.Reflection.PropertyInfo propertyInfo = type.GetProperty("Name");propertyInfo.SetValue(obj, "ding", null);}Console.Read();}
二、通過反射調(diào)用實例
static void Main(string[] args){//[1].CsharpCodePrivode//提供對C#代碼生成器和代碼編譯器的實例的訪問。如果要動態(tài)生成VB代碼,可以使用VBCodeProvider.//CreateCompiler():獲取編譯器的實例CSharpCodeProvider objcsharpcodeprivoder = new CSharpCodeProvider();//[2].ICodeComplier//定義用于調(diào)用源代碼編譯的接口或使用指定編譯器的CodeDOM樹。//每種編譯方法都接受編譯器的ComplierParameter對象,并返回指示編譯結(jié)果的CompilerResults對象ICodeCompiler codeCompiler = objcsharpcodeprivoder.CreateCompiler();//[3].ComplierParameters 表示用于調(diào)用編譯器的參數(shù)//ReferencedAssembies:獲取當(dāng)前項目所引用的程序集。Add方法為程序集添加引用//GenerateExecutable:獲取或設(shè)置一個值,該值指示是否生成可執(zhí)行文件。若此屬性為false,則生成Dll,默認(rèn)是false.//GenerateInMemor:獲取或設(shè)置一個值,該值指示是否在內(nèi)存中生成輸出。CompilerParameters objcompilerparameters = new CompilerParameters();// objcompilerparameters.ReferencedAssemblies.Add("System.dll");objcompilerparameters.GenerateExecutable = false;objcompilerparameters.GenerateInMemory = true;//[4].CompilerResults 表示從編譯器返回的編譯結(jié)果//CompiedAssembly:獲取或設(shè)置以編譯的程序集,Assembly類型。CompilerResults cr = codeCompiler.CompileAssemblyFromSource(objcompilerparameters, GenerateCode());if (cr.Errors.HasErrors){Console.WriteLine("編譯錯誤:");foreach (CompilerError item in cr.Errors){Console.WriteLine(item.ErrorText);}}else{//通過反饋,調(diào)用HelloWorld實例Assembly assembly = cr.CompiledAssembly;object objHelloWorld = assembly.CreateInstance("DynamicCodeGenerate.HelloWorld");MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");Console.WriteLine(objMI.Invoke(objHelloWorld,null));}Console.ReadLine();}static string GenerateCode(){StringBuilder sb = new StringBuilder();sb.Append("using System;");sb.Append(Environment.NewLine);sb.Append("namespace DynamicCodeGenerate");sb.Append(Environment.NewLine);sb.Append("{");sb.Append(Environment.NewLine);sb.Append(" public class HelloWorld");sb.Append(Environment.NewLine);sb.Append(" {");sb.Append(Environment.NewLine);sb.Append(" public string OutPut()");sb.Append(Environment.NewLine);sb.Append(" {");sb.Append(Environment.NewLine);sb.Append(" return \"Hello world!\";");sb.Append(Environment.NewLine);sb.Append(" }");sb.Append(Environment.NewLine);sb.Append(" }");sb.Append(Environment.NewLine);sb.Append(" }");string code = sb.ToString();Console.WriteLine(code);Console.WriteLine();return code;}
三、通過動態(tài)加載Dll生成實例
dom.DoCompileFile(Path.Combine(pathStr, filename), "Test.dll");MySampleDomain = AppDomain.CreateDomain("MySampleDomain");ass = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "Test.dll");obj = MySampleDomain.CreateInstanceAndUnwrap(ass.FullName, "Sample.Demo");
四、通過反射調(diào)用方法
Type type = obj.GetType();MethodInfo method = type.GetMethod("Add");int a=Convert.ToInt32( method.Invoke(obj, new object[] { 1,3 }));Console.WriteLine(a);
五、完整代碼
public class ReflexHelp{public void Execute(string gencode){//[1].CsharpCodePrivode//提供對C#代碼生成器和代碼編譯器的實例的訪問。如果要動態(tài)生成VB代碼,可以使用VBCodeProvider.//CreateCompiler():獲取編譯器的實例CSharpCodeProvider objcsharpcodeprivoder = new CSharpCodeProvider();//[2].ICodeComplier//定義用于調(diào)用源代碼編譯的接口或使用指定編譯器的CodeDOM樹。//每種編譯方法都接受編譯器的ComplierParameter對象,并返回指示編譯結(jié)果的CompilerResults對象ICodeCompiler codeCompiler = objcsharpcodeprivoder.CreateCompiler();//[3].ComplierParameters 表示用于調(diào)用編譯器的參數(shù)//ReferencedAssembies:獲取當(dāng)前項目所引用的程序集。Add方法為程序集添加引用//GenerateExecutable:獲取或設(shè)置一個值,該值指示是否生成可執(zhí)行文件。若此屬性為false,則生成Dll,默認(rèn)是false.//GenerateInMemor:獲取或設(shè)置一個值,該值指示是否在內(nèi)存中生成輸出。CompilerParameters objcompilerparameters = new CompilerParameters();// objcompilerparameters.ReferencedAssemblies.Add("System.dll");objcompilerparameters.GenerateExecutable = false;objcompilerparameters.GenerateInMemory = true;//[4].CompilerResults 表示從編譯器返回的編譯結(jié)果//CompiedAssembly:獲取或設(shè)置以編譯的程序集,Assembly類型。CompilerResults cr = codeCompiler.CompileAssemblyFromSource(objcompilerparameters, gencode);if (cr.Errors.HasErrors){Console.WriteLine("編譯錯誤:");foreach (CompilerError item in cr.Errors){Console.WriteLine(item.ErrorText);}}else{//通過反饋,調(diào)用HelloWorld實例Assembly assembly = cr.CompiledAssembly;object objHelloWorld = assembly.CreateInstance("DynamicCodeGenerate.HelloWorld");MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");Console.WriteLine(objMI.Invoke(objHelloWorld, null));}}public object GenObject(string dllFileName, string typeName){Assembly ass = Assembly.LoadFile(dllFileName);return ass.CreateInstance(typeName);}public int GetAddInfo(object obj, string methrName){Type type = obj.GetType();MethodInfo method = type.GetMethod(methrName);return Convert.ToInt32(method.Invoke(obj, new object[] { 1, 3 }));}/// <summary>/// 編譯代碼/// </summary>/// <param name="provider">編譯器</param>/// <param name="sourceFile">源文件</param>/// <param name="gentenFile">生成文件名</param>/// <returns>編譯結(jié)果</returns>public CompilerResults CompileCode(CodeDomProvider provider, string sourceFile, string gentenFile){string[] referenceAssemblies = { "System.dll" };CompilerParameters cp = new CompilerParameters(referenceAssemblies, gentenFile, false);cp.GenerateExecutable = false;//設(shè)置是否要包含一個入口點CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceFile);return cr;}}