ایجاد ویژگی های سفارشی در سی شارپ

ویژگی های راهی برای اضافه کردن ابرداده به کد خود ارائه دهید.
در این پست وبلاگ ما اصول اولیه چیستی ویژگی ها، نحوه تنظیم ویژگی های ویژگی و نحوه پیکربندی جایی که ویژگی ها می توانند اعمال شوند را پوشش خواهیم داد.
در نهایت، ما به یک مثال عملی می پردازیم تا نشان دهیم چگونه می توان از ویژگی های سفارشی در برنامه ها استفاده کرد.
در وب سایت من: antondevtips.com من در حال حاضر وبلاگ هایی در مورد C# دارم. مشترک شوید زیرا موارد بیشتری در راه است.
صفت چیست؟
ویژگی های در سی شارپ راهی برای اضافه کردن اطلاعات اعلامی به کد شما هستند.
آنها ابرداده ای را ارائه می دهند که می تواند برای کنترل جنبه های مختلف رفتار برنامه شما در زمان اجرا یا زمان کامپایل استفاده شود.
ویژگی ها را می توان برای عناصر مختلف برنامه اعمال کرد مانند:
- مجموعه ها، ماژول ها، کلاس ها، رابط ها، ساختارها، enums
- روش ها، سازنده ها، نمایندگان، رویدادها
- خواص، فیلدها، پارامترها، پارامترهای عمومی، مقادیر بازگشتی
- یا تمامی عناصر ذکر شده
شما می توانید یک یا چند ویژگی را برای این عناصر برنامه اعمال کنید.
شما هر روز هنگام ایجاد برنامه در NET از ویژگی ها استفاده می کنید.
به عنوان مثال، ویژگی های زیر را که زیاد دیده اید و استفاده کرده اید:
[Serializable]
public class User
{
}
[ApiController]
[Route("api/users")]
public class UsersController : ControllerBase
{
}
نحوه ایجاد یک ویژگی سفارشی
ویژگی در سی شارپ کلاسی است که از پایه به ارث می برد Attribute
کلاس
بیایید نگاهی به نحوه ایجاد یک ویژگی سفارشی بیندازیم:
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public class CustomAttribute : Attribute
{
}
[Custom]
public class MyClass
{
}
نام کلاس ویژگی باید دارای یک باشد Attribute
پسوند.
وقتی برای هر عنصری اعمال می شود، این پسوند حذف می شود.
هنگام ایجاد یک کلاس ویژگی، از یک ویژگی داخلی استفاده میکنید تا مشخص کنید کجا میتواند این ویژگی اعمال شود:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true)]
public class CustomAttribute : Attribute
{
}
شما می توانید چندین هدف را با “|” ترکیب کنید. عملگر برای تعیین جایی که یک ویژگی می تواند اعمال شود.
Inherited
پارامتر نشان می دهد که آیا ویژگی سفارشی می تواند توسط کلاس های مشتق شده به ارث برسد یا خیر. مقدار پیش فرض است true
.
[AttributeUsage(AttributeTargets.Class, Inherited = true)]
public class CustomInheritedAttribute : Attribute
{
}
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public class CustomNonInheritedAttribute : Attribute
{
}
هنگام درخواست به ارث برده نسبت دادن به ParentA
کلاس، توسط a به ارث می رسد ChildA
کلاس:
[CustomInherited]
public class ParentA
{
}
public class ChildA
{
}
اینجا ChildA
کلاس یک دارد CustomInherited
صفت.
در حالی که در مثال زیر هنگام استفاده از a غیر ارثی ویژگی برای ParentB
، به الف اعمال نمی شود ChildB
کلاس:
[CustomNonInherited]
public class ParentB
{
}
public class ChildB
{
}
ویژگی های صفت
ویژگی های ویژگی می تواند مورد نیاز (پارامترهای اجباری) یا غیر ضروری (پارامترهای اختیاری) باشد.
ویژگی ها می توانند آرگومان ها را همانند متدها و ویژگی ها بپذیرند.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false)]
public class CustomWithParametersAttribute : Attribute
{
public string RequiredProperty { get; }
public int OptionalProperty { get; set; }
public CustomWithParametersAttribute(string requiredProperty)
{
RequiredProperty = requiredProperty;
}
}
خواص مورد نیاز باید به عنوان پارامترهای سازنده صفت تعریف شوند.
در حالی که غیر الزامی نباید در سازنده تعریف شود.
هنگام اعمال چنین ویژگی برای یک کلاس، باید مقادیر مشخصه را به ترتیبی که در سازنده تعریف شده اند تنظیم کنید.
خواص اختیاری باید با نام آنها مشخص شود:
[CustomWithParameters("some text here", OptionalProperty = 5)]
public class ExampleClass
{
}
مثال عملی استفاده از ویژگی ها
بیایید یک ویژگی سفارشی ایجاد کنیم تا نقشهای مجاز برای دسترسی به روش کنترلر را مشخص کنیم:
[AttributeUsage(AttributeTargets.Method, Inherited = false)]
public class AuthorizeRolesAttribute : Attribute
{
public string[] Roles { get; }
public AuthorizeRolesAttribute(params string[] roles)
{
Roles = roles;
}
}
بعد، ما آن را اعمال می کنیم AuthorizeRolesAttribute
به متدهای یک کلاس، با مشخص کردن نقشهایی که اجازه دسترسی به هر متد را دارند:
public class AccountController
{
[AuthorizeRoles("Admin", "Manager")]
public void AdminOnlyAction()
{
Console.WriteLine("Admin or Manager can access this method.");
}
[AuthorizeRoles("User")]
public void UserOnlyAction()
{
Console.WriteLine("Only users can access this method.");
}
public void PublicAction()
{
Console.WriteLine("Everyone can access this method.");
}
}
برای استفاده از این ویژگی، میتوانیم از بازتاب استفاده کنیم تا اطلاعاتی در مورد اینکه چه ویژگیهایی برای یک متد اعمال میشود و چه ویژگیهایی دارند به دست آوریم:
public class RoleBasedAccessControl
{
public void ExecuteAction(object controller, string methodName, string userRole)
{
var method = controller.GetType().GetMethod(methodName);
var attribute = method?.GetCustomAttribute<AuthorizeRolesAttribute>();
if (attribute is null || attribute.Roles.Contains(userRole))
{
method?.Invoke(controller, null);
}
else
{
Console.WriteLine("Access denied. User does not have the required role.");
}
}
}
در اینجا یک متد را با نام از یک کلاس کنترلر دریافت می کنیم و if را بررسی می کنیم AuthorizeRolesAttribute
ویژگی به روش اعمال می شود.
در صورت اعمال، بررسی می کنیم که آیا کاربر می تواند به روش داده شده دسترسی داشته باشد یا خیر.
در نهایت، میتوانیم منطق کنترل دسترسی مبتنی بر نقش را با نقشهای مختلف کاربر آزمایش کنیم:
var controller = new AccountController();
var accessControl = new RoleBasedAccessControl();
Console.WriteLine("Testing with Admin role:");
accessControl.ExecuteAction(controller, nameof(AccountController.AdminOnlyAction), "Admin");
Console.WriteLine("\nTesting with User role:");
accessControl.ExecuteAction(controller, nameof(AccountController.UserOnlyAction), "User");
Console.WriteLine("\nTesting with Guest role:");
accessControl.ExecuteAction(controller, nameof(AccountController.AdminOnlyAction), "Guest");
Console.WriteLine("\nTesting public method with Guest role:");
accessControl.ExecuteAction(controller, nameof(AccountController.PublicAction), "Guest");
خروجی:
Testing with Admin role:
Admin or Manager can access this method.
Testing with User role:
Only users can access this method.
Testing with Guest role:
Access denied. User does not have the required role.
Testing public method with Guest role:
Everyone can access this method.
در این مثال، AuthorizeRolesAttribute
برای تعیین نقش های مجاز برای دسترسی به هر متد در استفاده می شود AccountController
.
را RoleBasedAccessControl
کلاس این محدودیت ها را با بررسی نقش کاربر در برابر نقش های تعریف شده در ویژگی اعمال می کند.
این نشان میدهد که چگونه ویژگیهای سفارشی را میتوان به روشی کاربردی و مفید در یک سناریوی دنیای واقعی مورد استفاده قرار داد.
امیدوارم این پست وبلاگ برای شما مفید واقع شود. کد نویسی مبارک!
پست اصلی وبلاگ را در وب سایت من بخوانید https://antondevtips.com.
پس از خواندن پست به موارد زیر توجه کنید:
-
اشتراک در برای دریافت خبرنامه با آخرین پست های وبلاگ
-
دانلود کد منبع این پست از من github (برای حامیان مالی من در BuyMeACoffee و Patreon موجود است)
اگر محتوای من را دوست دارید – به حمایت از من فکر کن
با پیوستن به من، قفل دسترسی انحصاری به کد منبع پستهای وبلاگ را باز کنید پاترئون وبرای من یک قهوه بخر جوامع!