کلاس‌ های پویا با استفاده از #C

چهارشنبه 10 شهریور 1395

در این مقاله با روش تولید کدهای پویا در #C توسط CodeDOM آشنا خواهیدشد و خواهیددید که چگونه می‌توانیم در زمان اجرا کلاس #C ایجاد نموده و آن‌را برای تولید یک اسمبلی کامپایل کنیم.

کلاس‌ های پویا با استفاده از #C

این‌جا ملاحظه خواهید کرد که چگونه می‌توانیم در زمان اجرا، کلاس C# ایجاد نموده و آن‌را برای تولید یک اسمبلی کامپایل کنیم. فضای نامی System.CodeDom در System.dll کلاس‌ها و توابع مختلفی را فراهم می‌کند که توسط آن می‌توانیم فضای نامی پویا ایجاد کرده و کلاس‌ها، متدها و خواص را به‌آن اضافه نماییم.

کارمان را با اضافه‌نمودن یک برنامه‌ی کنسول جدید و فضای نامی به برنامه‌مان توسط System.CodeDOM شروع می‌کنیم. ابتدا فضای نامی را برای انتخابمان ساخته، و آن‌را "myNamespace" نام‌گذاری می‌کنیم. بدین‌منظور از کلاس CodeNamespace استفاده خواهیم‌کرد. بدین‌ترتیب کدمان به‌شکل زیر خواهد شد:

    CodeNamespace nameSpace = new CodeNamespace("myNameSpace");  

سپس ما لیست موردنظر را که در کد پویا مورداستفاده قرار می‌گیرد، اضافه کرده و آن‌را تولید می‌کنیم. این چیز خاصی نیست، لیکن فضاهای نامی‌ای را که به‌طور عادی در برنامه‌هایمان اضافه می‌کردیم، این‌بار به‌صوت پویا اضافه می‌نماید، مانند: using System یا using System.Linq. برای این کار از قابلیت اضافه‌کردن تابع در کلاس CodeNamespace استفاده می‌کنیم. درنتیجه کدمان به‌شکل زیر خواهد شد:

    nameSpace.Imports.Add(new CodeNamespaceImport("System"));  
    nameSpace.Imports.Add(new CodeNamespaceImport("System.Linq"));  
    nameSpace.Imports.Add(new CodeNamespaceImport("System.Text"));  

بعد، توسط کلاس CodeTypeDeclaration کلاسی به نام MyClass را به فضای نامی myNamespaceمان اضافه می‌کنیم. این کلاس خاصیت‌های مختلفی را فراهم خواهد کرد، مانند: Name، IsClass، Attributes و ... که برای پیکربندی تعریف تابع استفاده می‌شود. بنابرین این کلاس به فضای نامی ما که همان myNamespace است اضافه خواهدشد. کد شما باید به‌صورت زیر شده‌باشد:

    CodeTypeDeclaration cls = new CodeTypeDeclaration();  
    cls.Name = "MyClass";  
    cls.IsClass = true;  
    cls.Attributes = MemberAttributes.Public;  
    nameSpace.Types.Add(cls);  

اکنون از کلاس CodeCompileUnit استفاده می‌کنیم. این فعالیت‌ها به‌عنوان یک دربرگیرنده که تمام کد مارا برای کامپایل و ساختن یک اسمبلی شامل می‌شود، استفاده خواهندشد. برای این‌که ببینید کد چه‌طور به‌نظر خواهد رسید، اجازه دهید توسط کلاس CodeCompileUnit روی سیستم خودمان آن‌را تکمیل کنیم. بدین‌منظور ما از کلاس StreamWriter استفاده می‌کنیم. بنابراین کدمان به‌صورت زیر خواهدشد:

    CodeCompileUnit compileUnit = new CodeCompileUnit();  
    compileUnit.Namespaces.Add(nameSpace);  
    CSharpCodeProvider csharpcodeprovider = new CSharpCodeProvider();   
      
    CSharpCodeProvider provider = new CSharpCodeProvider();  
      
    using (StreamWriter sw = new StreamWriter(@"D:\TestFile.cs", false))  
    {  
        IndentedTextWriter tw = new IndentedTextWriter(sw, "    ");  
        provider.GenerateCodeFromCompileUnit(compileUnit, tw, new CodeGeneratorOptions());  
        tw.Close();  
    }  

و کد نهایی برنامه را در صورت زیر می‌بینید:

              CodeNamespace nameSpace = new CodeNamespace("myNameSpace");  
      
              nameSpace.Imports.Add(new CodeNamespaceImport("System"));  
              nameSpace.Imports.Add(new CodeNamespaceImport("System.Linq"));  
              nameSpace.Imports.Add(new CodeNamespaceImport("System.Text"));  
      
              CodeTypeDeclaration cls = new CodeTypeDeclaration();  
              cls.Name = "MyClass";  
              cls.IsClass = true;  
              cls.Attributes = MemberAttributes.Public;  
              nameSpace.Types.Add(cls);  
      
              CodeCompileUnit compileUnit = new CodeCompileUnit();  
              compileUnit.Namespaces.Add(nameSpace);  
              CSharpCodeProvider csharpcodeprovider = new CSharpCodeProvider();   
      
              CSharpCodeProvider provider = new CSharpCodeProvider();  
      
              using (StreamWriter sw = new StreamWriter(@"D:\TestFile.cs", false))  
              {  
                  IndentedTextWriter tw = new IndentedTextWriter(sw, "    ");  
                  provider.GenerateCodeFromCompileUnit(compileUnit, tw, new CodeGeneratorOptions());  
                  tw.Close();  
              }  

کد برنامه را اجرا کنید، محل آن‌را در رایانه مشاهده و فایلِ کدتان را که توسط کد تولید شده‌است، ملاحظه فرمایید:

    //------------------------------------------------------------------------------  
    // <auto-generated>  
    //     This code was generated by a tool.  
    //     Runtime Version:4.0.30319.42000  
    //  
    //     Changes to this file may cause incorrect behavior and will be lost if  
    //     the code is regenerated.  
    // </auto-generated>  
    //------------------------------------------------------------------------------  
      
    namespace myNameSpace {  
        using System;  
        using System.Linq;  
        using System.Text;  
          
          
        public class MyClass {  
        }  
    }  

بعد از این، کار درباره‌ی چگونگی تولید کلاس، توسط فضای نام (namespace) با استفاده از کلاس‌های CodeDOM می‌باشد. برای آشنایی با شیوه‌ی اضافه نمودن متد به این کلاس‌ها، مقاله‌های بعدی را دنبال کنید.

آموزش سی شارپ

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 1k بازدید
  • 3 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید