در آموزش ساخت سرویس Enum در EF Core ابتدا برسی میکنیم Enum چیست. بعد به ویژگی ها و دلایل استفاده از Enum ها میپردازیم. و در آخر هم سرویسی برای دریافت مقادیر Enum همراه با Display Name آن ایجاد میکنیم. با آموزش ساخت سرویس Enum با ما همراه باشید.
Enum مخفف Enumeration است. و یک نوع دادهای خاص در زبان C# است. که برای تعریف مجموعهای از مقادیر نامگذاریشده استفاده میشود. این مقادیر معمولاً مقادیر عدد صحیح هستند و به خوانایی کد و جلوگیری از استفاده از مقادیر عددی کمک میکنند.
Enum در C# یک نوع دادهای است. که برای گروهبندی چند مقدار ثابت و مرتبط با هم استفاده میشود. به جای اینکه از اعداد در برنامه استفاده کنیم، Enum کمک میکند تا نامهای مشخص و قابل فهم برای این مقادیر داشته باشیم.
برای مثال، یک Enum برای وضعیت سفارش در یک سیستم فروشگاهی را ایجاد میکنیم:
public enum OrderStatus
{
Pending = 1, // سفارش در انتظار پردازش
Processing = 2, // سفارش در حال پردازش
Shipped = 3, // سفارش ارسال شده است
Delivered = 4, // سفارش تحویل داده شده است
Canceled = 5 // سفارش لغو شده است
}
ساخت سرویس قدرتمند EnumService در ASP.NET Core 9
در توسعه اپلیکیشنهای تحت وب با استفاده از ASP.NET Core، مدیریت بهینه و ساده دادهها اهمیت بسیار بالایی دارد. یکی از نیازهای متداول در پروژهها، تبدیل مقادیر Enum به لیستی است که بتوان به سادگی از آن در رابط کاربری استفاده کرد. سرویس EnumService دقیقاً برای این نیاز طراحی شده است.
ابتدا یک Interface برای سرویس تعریف شده است تا امکان پیادهسازیهای مختلف و رعایت اصول Dependency Injection فراهم شود. در این اینترفیس، متدی تعریف شده که یک Enum جنریک را دریافت کرده و لیستی از SelectListItem تولید میکند.
public interface IEnumService
{
public IEnumerable<SelectListItem> GetEnumList<TEnum>() where TEnum:Enum;
}
این کلاس، اینترفیس IEnumService را پیادهسازی کرده و متدی برای استخراج مقادیر Enum و تبدیل آنها به لیستی از SelectListItem ارائه میدهد.
public class EnumService : IEnumService
{
public IEnumerable<SelectListItem> GetEnumList<TEnum>() where TEnum : Enum
{
return Enum.GetValues(typeof(TEnum))
.Cast<TEnum>()
.Select(e => new SelectListItem
{
Value = ((int)(object)e).ToString(),
Text = GetEnumDisplayName(e)
});
}
private static string GetEnumDisplayName(Enum value)
{
var field = value.GetType().GetField(value.ToString());
var attribute = field?.GetCustomAttribute<DisplayAttribute>();
return attribute?.Name ?? value.ToString();
}
}
کد زیر تمام مقادیر موجود در Enum مشخصشده را استخراج میکند.
Enum.GetValues(typeof(TEnum))
در زبان برنامهنویسی #C، عمل Cast کردن به معنای تبدیل یک نوع داده به نوع دیگری است. مثلاً وقتی شما از Enum.GetValues استفاده میکنید، خروجی آن به صورت یک آرایهای از نوع کلی object است. در این حالت، برای اینکه بتوانید از مقادیر بهصورت نوع مشخص شده (TEnum) استفاده کنید، باید عمل Cast را انجام دهید. متد GetValues یک آرایه از object برمیگرداند، بنابراین باید این مقادیر را به نوع اصلی TEnum تبدیل کنیم.
Cast<TEnum>()
مقدارهای Enum را به SelectListItem تبدیل میکند.
.Select(e => new SelectListItem
ابتدا e را به object تبدیل میکنیم. سپس آن را به int تبدیل میکنیم. .ToString(): مقدار را به رشته تبدیل میکند زیرا Value در SelectListItem باید از نوع string باشد.
Value = ((int)(object)e).ToString(),
مقدار Text در SelectListItem را برابر نام نمایشی مقدار Enum تنظیم میکند. GetEnumDisplayName(e): این متد بررسی میکند که آیا مقدار Enum دارای ویژگی [Display(Name = “…”)] است یا خیر.
Text = GetEnumDisplayName(e)
این متد مقدار Enum را دریافت کرده و نام نمایشی آن را استخراج میکند.
private static string GetEnumDisplayName(Enum value)
مقدار value.GetType(): نوع Enum را دریافت میکند. GetField(value.ToString()): مقدار Enum را به string تبدیل کرده و فیلد مربوط به آن را دریافت میکند.
var field = value.GetType().GetField(value.ToString());
مقدار GetCustomAttribute<DisplayAttribute>(): بررسی میکند که آیا فیلد Enum دارای ویژگی DisplayAttribute است یا خیر.
var attribute = field?.GetCustomAttribute<DisplayAttribute>();
اگر ویژگی DisplayAttribute وجود داشته باشد، مقدار Name آن را برمیگرداند. در غیر این صورت، نام Enum را برمیگرداند.
return attribute?.Name ?? value.ToString();
مثل همیشه عالی ،واقعا خسته نباشید