استفاده از نوع داده dynamic

تعداد بازدید ها : 11 بازدید
 استفاده از نوع داده 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# توضیح بده
محمدمجتبی جوارشکیان

محمدمجتبی جوارشکیان

من محمدمجتبی جوارشکیان ، کارشناس IT و فعال اجتماعی هستم و در حوزه معماری ، طراحی ، تحلیل گری ، مدلسازی و توسعه ی محیط های نرم افزاری فعالیت دارم. همانند سایر کارشناسان IT در تلاشم تا دنیا جای زیباتری برای زندگی باشد. بسیار خوشحال می شوم من را از انتقادات ، پیشنهادات و نظرات خود مطلع فرمایید. آدرس ایمیل : mjfakhr@yahoo.com

ارسال یک پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

2 + 1 =