برنامه نویسی

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

ویژگی های راهی برای اضافه کردن ابرداده به کد خود ارائه دهید.
در این پست وبلاگ ما اصول اولیه چیستی ویژگی ها، نحوه تنظیم ویژگی های ویژگی و نحوه پیکربندی جایی که ویژگی ها می توانند اعمال شوند را پوشش خواهیم داد.
در نهایت، ما به یک مثال عملی می پردازیم تا نشان دهیم چگونه می توان از ویژگی های سفارشی در برنامه ها استفاده کرد.

در وب سایت من: 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 موجود است)

اگر محتوای من را دوست دارید – به حمایت از من فکر کن

با پیوستن به من، قفل دسترسی انحصاری به کد منبع پست‌های وبلاگ را باز کنید پاترئون وبرای من یک قهوه بخر جوامع!

https%3A%2F%2Fdev to

https%3A%2F%2Fdev to uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwe1ossm2vbb85ywm5a4

نوشته های مشابه

دیدگاهتان را بنویسید

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

دکمه بازگشت به بالا