اضافه کردن متدها در کلاس داینامیک
یکشنبه 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; } } }
- C#.net
- 1k بازدید
- 2 تشکر