日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

动态生成一个继承接口的类

發布時間:2025/7/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态生成一个继承接口的类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

接口:

namespace LibertyPortal.Main.IDAL
{
??? public interface Interface1
??? {
??????? void www();
??? }
}???

調用

??????? Assembly assembly = NewAssembly();
??????? Interface1 www = assembly.CreateInstance("xml.tables.Test1") as Interface1;

方法

public static Assembly NewAssembly()
??? {
??????? //foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
??????? //{
??????? //??? string wzcxzww = asm.Location;
??????? //}
??????? //創建編譯器實例。
??????? CSharpCodeProvider provider = new CSharpCodeProvider();
??????? //設置編譯參數。
??????? CompilerParameters paras = new CompilerParameters();
??????? paras.GenerateExecutable = false;
??????? paras.GenerateInMemory = true;


??????? string wwasw= System.Web.HttpContext.Current.Server.MapPath("Bin");
??????? paras.ReferencedAssemblies.Add(wwasw+"http://www.cnblogs.com/cuihongyu3503319/admin/file://libertyportal.main.idal.dll%22);//要真實地址
??????? paras.ReferencedAssemblies.Add("System.dll");//全局的不用


??????? CodeCompileUnit m_CodeCompileUnit;
??????? CodeNamespace m_CodeNameSpace;//命名空間
??????? CodeTypeDeclaration m_Class;//類
??????? m_CodeCompileUnit = new CodeCompileUnit();
??????? m_CodeNameSpace = new CodeNamespace("xml.tables");
??????? m_CodeCompileUnit.Namespaces.Add(m_CodeNameSpace);
??????? m_Class = new CodeTypeDeclaration("Test1");//類名為Test1
??????? m_Class.IsClass = true;//是類


??????? //產生www方法
??????? CodeTypeReference voidReference = new CodeTypeReference("System.void");//方法無返回值
??????? CodeMemberMethod Test = new CodeMemberMethod();//方法
??????? Test.ReturnType = voidReference;
??????? Test.Name = "www";
??????? Test.Attributes = MemberAttributes.Public | MemberAttributes.Final;
??????? //CodeVariableReferenceExpression m_AddFlagExpression = new CodeVariableReferenceExpression("m_AddFlag");

??????? //CodeAssignStatement assignAddTrue = new CodeAssignStatement(m_AddFlagExpression, new CodePrimitiveExpression(true));
??????? //Test.Statements.Add(assignAddTrue);
??????? m_Class.Members.Add(Test);

?


??????? //m_Class.BaseTypes.Add(new CodeTypeReference(typeof(Object)));
??????? m_Class.BaseTypes.Add(new CodeTypeReference(typeof(Interface1)));//類父親
??????? m_CodeNameSpace.Types.Add(m_Class);


??????? #region 輸出生成源代碼
??????? ICodeGenerator g = provider.CreateGenerator();
??????? g.GenerateCodeFromType(m_Class,System.Web.HttpContext.Current.Response.Output , null);??

??????? #endregion

??????? CompilerResults result = provider.CompileAssemblyFromDom(paras, m_CodeCompileUnit);//編譯


??????? if (result.Errors.Count > 0)
??????? {
??????????? // 顯示編譯錯誤信息。??
??????????? string www = "";
??????????? foreach (CompilerError ce in result.Errors)
??????????? {
??????????????? www += ce.ToString();
??????????????? //Debug.WriteLine();
??????????? }
??????????? System.Web.HttpContext.Current.Response.Write(www);
??????????? return null;
??????? }
??????? else
??????? {
??????????? Debug.WriteLine(result.PathToAssembly);
??????? }

??????? //編譯代碼。
??????? //CompilerResults result = provider.CompileAssemblyFromSource(paras, classSource.ToString());

??????? //獲取編譯后的程序集。
??????? Assembly assembly = result.CompiledAssembly;


??????? return assembly;
??? }

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的动态生成一个继承接口的类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。