نمایش نتایج 1 تا 4 از 4

نام تاپیک: دریافت نام نمونه ای که از Attribute استفاده کرده

Hybrid View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #1
    کاربر دائمی آواتار mmbguide
    تاریخ عضویت
    اسفند 1386
    محل زندگی
    منظومه شمسی
    پست
    1,255

    دریافت نام نمونه ای که از Attribute استفاده کرده

    سلام دوستان

    من یک DisplayAttribute سفارشی ایجاد کردم و میخوام اون رو در کلاس های Entity استفاده کنم. به ازای هر property موجود در کلاس entity یکبار کلاس DisplayAttribute اجرا میشه. حالا در این صفت سفارشی من نمیخوام پارامتر ورودی تعریف کنم بلکه میخوام در کدهای نوشته شده در کلاس DisplayAttribute بفهمم که کدام property این صفت را صدا زده. آیا راهی هست که نام property رو بدست بیارم؟

    تشکر

  2. #2
    کاربر دائمی آواتار ROSTAM2
    تاریخ عضویت
    اسفند 1390
    محل زندگی
    فارس
    پست
    2,010

    نقل قول: دریافت نام نمونه ای که از Attribute استفاده کرده


  3. #3
    کاربر دائمی آواتار mmbguide
    تاریخ عضویت
    اسفند 1386
    محل زندگی
    منظومه شمسی
    پست
    1,255

    نقل قول: دریافت نام نمونه ای که از Attribute استفاده کرده

    ضمن تشکر. پاسخ صحیح در لینک زیر پیدا شد

    https://stackoverflow.com/questions/...tribute-is-set

  4. #4
    کاربر دائمی آواتار mmbguide
    تاریخ عضویت
    اسفند 1386
    محل زندگی
    منظومه شمسی
    پست
    1,255

    نقل قول: دریافت نام نمونه ای که از Attribute استفاده کرده

    سلام دوستان

    در لینک معرفی شده به یک Attribute با نام CallMemberName اشاره شده که در نتیجه کدهای خودم را بصورت زیر اصلاح کردم:

            public cesDisplayAttribute([CallerMemberName] string propertyName = null, Type type = null, bool unique = false)
    {
    _typeFullName = type?.FullName ?? string.Empty;
    _propertyName = propertyName;
    _unique = unique;
    _displayName = propertyName;
    }


    در واقع این صفت باید برای یک پارامتر با مقدار Default تعریف بشه و وجود CallMemberName باعث میشه که پارامتر ورودی بصورت خودکار با نام Property که از Attribute سفارشی استفاده کرده مقدار دهی بشه. بنابر این بعد از این کار فقط از attribute سفارشی بدون پارامتر استفاده میکنم و دلیلش هم اینه که در کدهای Atrribute سفارشی با توجه به نام property مقدار معادل اون را به انگلیسی و یا فارسی از بانک میخونم و برمیگردونم و دیگه نیازی نیست که مقدار را برای تمام entityهای یک پروژه تعریف کنم که کار بسیار وقتگیری هم هست.

    البته بدین صورت پیاده سازی کردم که اگر مقدار در بانک موجود بود که معادل فارسی و یا انگلیسی اون با توجه به Culture برنامه برگردونده میشه و اگر مقدار وجود نداشت، مقدار جدید داخل بانک ثبت میشه. ابن کار کمک میکنه که مثلا برای تمام propertyهایی که نامشان Id هست تنها یک آیتم در بانک اطلاعاتی ثبت بشه و برای تمام propertyها در تمام برنامه از مقدار آن استفاده خواهد شد. همچنین در صورت نیاز به ایجاد یک نام منحصر بفرد برای یک عنوان با معادل متفاوت، دو پارامتر ورودی باید الزاما مقدار دهی بشه. بدین منظور در زمان ثبت نام property نام کامل کلاس entity به ابتدای نام اضافه خواهد شد که یک کلید منحصر بفرد ایجاد خواهد کرد و میتوان برای این موارد معادل های متفاوتی تعریف کرد.

    در نمونه کلاس زیر، بانک اطلاعاتی یک فایل resources.resx هستش که در کنار فایل اصلی برنامه قرار داره و میشه برای تمام زبان ها یک فایل به اون اضافه کرد و یا اگر به بانک اطلاعاتی متصل میشه راه حل های بهتری پیاده سازی کرد. کدهای صفت سفارشی خودم را در زیر قرار میدم شاید بدرد بخوره و اگر هم ایرادی در کد هستش لطفا عنوان کنید (هنوز بررسی و مدیریت همزمانی خواندن و نوشتن در فایل را انجام ندارم). در حال حاضر بررس Culture و انتخاب فایل فارسی و یا انگلیسی پیاده سازی نشده.


    using System.Collections;
    using System.ComponentModel;
    using System.Resources.NetStandard;
    using System.Runtime.CompilerServices;


    namespace cesEntities
    {
    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
    public class cesDisplayAttribute : DisplayNameAttribute
    {
    private string _propertyName { get; set; }
    private string _typeFullName { get; set; }
    private bool _unique { get; set; }
    private string _displayName { get; set; }


    public cesDisplayAttribute([CallerMemberName] string propertyName = null, Type type = null, bool unique = false)
    {
    _typeFullName = type?.FullName ?? string.Empty;
    _propertyName = propertyName;
    _unique = unique;
    _displayName = propertyName;
    }


    public override string DisplayName
    {
    get
    {
    //تعریف آدرس فایل عبارات انگلیسی
    string path_en = Path.Combine(Directory.GetCurrentDirectory(), "cesDisplayNames_en.resx");


    //نمونه سازی کلاس خواننده اطلاعات از فایل رسورس
    ResXResourceReader rr_en = new ResXResourceReader(path_en);
    bool check_en = false;

    //جستجوی عبارت در فایل انگلیسی
    foreach (DictionaryEntry item in rr_en)
    {
    if (_unique)
    {
    if (item.Key.ToString() == _typeFullName + "_" + _propertyName)
    {
    check_en = true;
    _displayName = item.Value?.ToString() ?? string.Empty;
    return _displayName;
    }
    }
    else
    {
    if (item.Key.ToString() == _propertyName)
    {
    check_en = true;
    _displayName = item.Value?.ToString() ?? string.Empty;
    return _displayName;
    }
    }
    }


    //اگر در مرحله قبلی عبارت مورد نظر پیدا نشد به معنای آن است
    //که عبارت در آن فایل وجود ندارد و بنابراین باید عبارت جدید
    //را در فایل مورد نظر ذخیره کنیم
    if (!check_en)
    {
    ResXResourceWriter rw_en = new ResXResourceWriter(path_en);
    var b_en = rr_en.GetEnumerator();


    //ابتدا تمام اطلاعات قبلی را در بررسی میکنیم
    //و مجددا کلید و مقدار را در فایل ذخیره خواهیم کرد
    while (b_en.MoveNext())
    {
    rw_en.AddResource(b_en.Key.ToString(), b_en.Value?.ToString());
    }


    //اگر قرار بود عبارت جدید منحصر بفرد باشد باید نام کامل مدل به عنوان
    //کلید در نظر گرفته شود و بعد نام پروپرتی به آن اضافه شود در غیر این
    //صورت عبارت جدید بدون نام کامل و تنها با نام پروپرتی ذخیره خواهد شد
    if (_unique)
    {
    //برای عبارت انگلیسی که با سه حرف اول
    //fld
    //شروع می شوند می توان آنها را حذف کرد
    rw_en.AddResource(_typeFullName + "_" + _propertyName, _propertyName.Replace("fld",string.Empty));
    }
    else
    {
    rw_en.AddResource(_propertyName, _propertyName.Replace("fld", string.Empty));
    }


    //ایجاد فایل و بستن منابع در سیستم
    rw_en.Generate();
    rw_en.Close();
    rr_en.Close();


    //برگرداندن مقدار جدید. البته چون معادل سازی
    //برای آن انجام نشده است برای بار اول نام همان
    //پروپرتی را برخواهد گرداند
    return _propertyName;
    }


    //اگر هیچ یک از مراحل فوق مقداری را برنگرداند برنامه
    //مقدار خالی را به عنوان نتیجه نهایی بر می گرداند
    return string.Empty;
    }
    }
    }
    }
    آخرین ویرایش به وسیله mmbguide : جمعه 08 مهر 1401 در 22:38 عصر دلیل: اصلاح غلط املایی

تاپیک های مشابه

  1. تکمیل کد با استفاده از پالت attribute
    نوشته شده توسط saeed51100 در بخش Android Studio
    پاسخ: 3
    آخرین پست: دوشنبه 26 شهریور 1397, 20:44 عصر
  2. سوال: Unrecognized attribute 'targetFramework'. Note that attribute names are case-sensitive
    نوشته شده توسط mbasirati در بخش ASP.NET MVC
    پاسخ: 1
    آخرین پست: یک شنبه 19 اردیبهشت 1395, 12:52 عصر
  3. attribute ها چی هستند
    نوشته شده توسط iut.ali در بخش برنامه نویسی با زبان C و ++C
    پاسخ: 1
    آخرین پست: یک شنبه 02 شهریور 1393, 09:55 صبح
  4. پاسخ: 2
    آخرین پست: دوشنبه 22 اردیبهشت 1393, 23:22 عصر
  5. مبتدی: طرز استفاده از Add attribute
    نوشته شده توسط mehrdad85 در بخش ASP.NET Web Forms
    پاسخ: 1
    آخرین پست: یک شنبه 14 اسفند 1390, 13:40 عصر

برچسب های این تاپیک

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •