اضافه کردن متدها در کلاس داینامیک

یکشنبه 2 آبان 1395

در این مقاله ،ما یاد خواهیم گرفت گه چگونه یک متد را به کلاس dynamic اضافه کنیم. که با یک مثال در زیر به شرح آن پرداخته ایم.

اضافه کردن متدها در کلاس داینامیک

برای اضافه کردن متد به کلاس های پویا ، ما از کلاس CodeMemberMethod استفاده میکنیم، که از property های مختلف در آن استفاده شده است که برای پیکربندی و تعیین متدمان میتوان استفاده کرد.

ما از این کلاس برای ساختن یک متد پویا استفاده خواهیم کرد، که دو پارامتر را به عنوان ورودی دریافت میکند و و روی آنها عملیات جمع را انجام میدهد و در آخر مقدار جواب نهایی را باز میگرداند.

شکل کلی متد را در کد زیر میبینید :

CodeTypeReference methodReturnType = new CodeTypeReference(typeof(System.Int32)); 
CodeMemberMethod myMethod = new CodeMemberMethod();  
  
 // Generate Method signatures.  
 myMethod.Name = "MySum";  
 myMethod.ReturnType = methodReturnType;  
 myMethod.Attributes = MemberAttributes.Public;  

توجه داشته باشید که استفاده از کلاس CodeTypeReference برای مشخص کردن نوع بازگشت متد ما است. 

در ادامه برای ساختن پارامتر های کلاس و اضافه کردن آنها به متد از کلاس CodeParameterDeclarationExpression استفاده خواهیم کرد.

// Initialize for Method parameters  
CodeParameterDeclarationExpression methodPrm1 = new CodeParameterDeclarationExpression(typeof(Int32), "X");  
CodeParameterDeclarationExpression methodPrm2 = new CodeParameterDeclarationExpression(typeof(Int32), "Y");  
myMethod.Parameters.AddRange(new CodeParameterDeclarationExpression[] { methodPrm1, methodPrm2 });

حال، با استفاده از کلاس  CodeSnippetExpression class ما متد definition خود را تعریف میکنیم.

متد definition ما به سادگی حاصل جمع پارامتر های ارسالی Y و X را برمیگرداند.

ما یک عبارت برای جمع کردن دو عدد و اضافه کردن آن ها به متد تولید کرده اییم. کد زیر را مشاهده نمایید :

// Generate method definition  
CodeSnippetExpression codeSnippet = new CodeSnippetExpression("return X + Y");  
  
// Add method definition to method  
myMethod.Statements.Add(codeSnippet); 

و سر انجام متد خود را به کلاس مان اضافه میکنیم :

// Add method to the class.  
cls.Members.Add(myMethod);  

کد کامل را در زیر میبینید :

 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);  
  
 // Initialize for Method Return type  
 CodeTypeReference methodReturnType = new CodeTypeReference(typeof(System.Int32));  
 CodeMemberMethod myMethod = new CodeMemberMethod();  
  
 // Generate Method signatures.  
 myMethod.Name = "MySum";  
 myMethod.ReturnType = methodReturnType;  
 myMethod.Attributes = MemberAttributes.Public | MemberAttributes.Final;  
  
 // Initialize for Method parameters  
 CodeParameterDeclarationExpression methodPrm1 = new CodeParameterDeclarationExpression(typeof(Int32), "X");  
 CodeParameterDeclarationExpression methodPrm2 = new CodeParameterDeclarationExpression(typeof(Int32), "Y");  
 myMethod.Parameters.AddRange(new CodeParameterDeclarationExpression[] { methodPrm1, methodPrm2 });  
  
 // Generate method definition  
 CodeSnippetExpression codeSnippet = new       CodeSnippetExpression("return X + Y");  
  
// Add method definition to method  
 myMethod.Statements.Add(codeSnippet);  
  
 // Add method to the class.  
 cls.Members.Add(myMethod);  
  
 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 {  
          
        public int MySum(int X, int Y) {  
            return X + Y;  
        }  
    }  
}  

آموزش سی شارپ

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

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

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

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