استفاده از نوع داده dynamic
اگر لازم است تعدادی داده را بسته بندی کرده و به یک تابع ارسال نمایید ، چند راهکار دارید . متداول ترین کار تعریف یک کلاس است ، تا در آن متغییرها را تعریف و سپس استفاده نمایید :
public class Data { public string DaftarType { get; set; } } // سپس میتوانید از این کلاس به صورت زیر استفاده کنید: var getData = new Data { DaftarType = "" }; getData.DaftarType = "NewDoc"; // بدون خطا
به نظر من تعریف کلاس ها قدری دست و پا گیر است و بعد از مدتی پروژه را با تعداد زیادی کلاس همراه می کند که بعضا فقط یکبار از آنها استفاده شده است . البته اگر در مواردی نیاز هست که از یک ساختار داده بارها استفاده نمایید حتما از تعریف کلاس ها استفاده نمایید .
در اینجا راه حل استفاده از انواع داده dynamic
است . در نوع داده dynamic
هر مقداری را می توانید بریزید و به سرعت به فرانت پاس دهید یا حتی از سمت فرانت دریافت نمایید :
[HttpPost("GetDocumentData")] public ActionResult GetDocumentData([FromBody] dynamic FilterData) { // ادامه کد شما }
در جاوا اسکریپت انواع داده داینامیک به راحتی تعریف و سپس استفاده می شود ولی در c#
این کار به راحتی جاوا نیست و برای بازیابی اطلاعات داخل یک متغییر داینامیک باید مراحلی را طی کنید :
[HttpPost("GetDocumentData")] public ActionResult GetDocumentData([FromBody] dynamic FilterData) { // تعریف متغییر به روش Tuple var getData = ( DaftarType: "", SalCheck: false, ); // بازیابی مقادیر داخل یک متغییر داینامیک using (JsonDocument doc = JsonDocument.Parse(FilterData.ToString())) { JsonElement root = doc.RootElement; getData.DaftarType = root.GetProperty("DaftarType").GetString() ?? ""; getData.SalCheck = root.GetProperty("SalCheck").GetBoolean(); } return Ok(getData ); }
به روشی که متغییر getData در کد بالا تعریف شده است می گویند Tuple ( تیپل به معنی چند تایی ) وقتی متغییری به این شکل ایجاد می کنید ، نیازی به تعریف نوع داده اجزاء داخلی آن ندارید و c#
نوع داده را از ورودی آن تشخیص خواهد داد ، همچنین این متغییر فقط خواندنی نیست و به راحتی می توانید به آن مقداردهی کنید .
برای استفاده از JsonDocument هم باید کتابخانه آن را وارد کنید :
using System.Text.Json;
در مثال زیر یک تابع وجود دارد که با استفاده از ORM دپر (Dapper) یک پروسیجر را از بانک اطلاعات فراخوانی می کند . نکته ای که در این کد وجود دارد استفاده از نوع داده dynamic
برای ارسال نتیجه به خروجی تابع است :
public static async Task<dynamic> SpSortDocRow(Int32 NID) { dynamic spResult; using (IDbConnection db = new SqlConnection(strConnection)) { var values = new { NID }; // ارسال مقادیر به پروسیجر و دریافت نتیجه در قالب دینامیک var result = await db.QueryAsync<dynamic>("SpSortDocRow", values, null, null, commandType: CommandType.StoredProcedure); // خواندن اولین سطر نتیجه دریافتی spResult = result.FirstOrDefault(); // اگر نتیجه برگشتی پروسیجر یک لیست بود به روش زیر دریافت می گردد // spResult = result.ToList(); } return spResult; }
تابع فوق به روش زیر فراخوانی می شود و نتیجه دریافتی نیز به راحتی به سمت فرانت ارسال می گردد :
// ورودی تابع از نوع dynamic // خروجی تابع از نوع IActionResult [HttpPost("FinalAcceptTbDocInfo")] public async Task<IActionResult> SpSortDocRow([FromBody] dynamic FilterData) { // تعریف متغییر به روش Tuple var getData = ( NId: 0 ); // بازیابی مقادیر داخل یک متغییر داینامیک using (JsonDocument doc = JsonDocument.Parse(FilterData.ToString())) { JsonElement root = doc.RootElement; getData.NId= root.GetProperty("NId").GetInt32(); } // فراخوانی پروسیجر مرتب سازی شماره ردیف های سند dynamic spResult = await DbAccounting_Dapper.SpSortDocRow(getData.NId); // ارسال نتیجه به فرانت return Ok(new { result = "OK", result_value = new { spResult } }); }
نتیجه گیری : هم در ورودی توابع و هم در خروجی توابع از نوع داده dynamic
می توانید استفاده نمایید .
منبع کمکی : Microsoft Copilot
متن سوال :
- درباره نوع داده Tuple در
c#
توضیح بده