استفاده از نوع داده 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#توضیح بده