Qanday qilib C# xususiyat nomini aks ettiruvchi qator sifatida olasiz? [dublikat]

Mumkin bo'lgan dublikat:
c# - O'zgaruvchining deklaratsiyasida fizik tarzda yozilganidek nomini qanday olish mumkin?

Men "kuchli yozilgan" sehrli satrga ega bo'lishim uchun xususiyat nomini satr sifatida olish yo'lini izlayapman. Men qilishim kerak bo'lgan narsa MyClass.SomeProperty.GetName() kabi "SomeProperty" ni qaytaradi. Bu C# da mumkinmi?


person Jim Mitchener    schedule 03.11.2009    source manba


Javoblar (3)


Bunga juda oson erishish uchun Ifodalardan foydalanishingiz mumkin. Namuna uchun bu blogga qarang.

Bu siz lambda orqali ifoda yaratishingiz va nomni chiqarib olishingiz mumkin bo'ladi. Masalan, INotifyPropertyChanged dasturini amalga oshirish quyidagi kabi ishlarni bajarish uchun qayta ishlanishi mumkin:

public int MyProperty {
    get { return myProperty; }
    set
    {
        myProperty = value;
        RaisePropertyChanged( () => MyProperty );
    }
}

O'zingizning ekvivalentingizni xaritada ko'rsatish uchun havola qilingan "Reflect" klassidan foydalanib, siz shunday ishni qilasiz:

string propertyName = Reflect.GetProperty(() => SomeProperty).Name;

Viola - sehrli satrlarsiz mulk nomlari.

person Reed Copsey    schedule 03.11.2009
comment
Bu erda sintaksis biroz yomon, lekin u menga kerak bo'lgan narsani qiladi. Rahmat! - person Jim Mitchener; 03.11.2009

Ushbu yondashuv Expression dan foydalanishdan ko'ra tezroq bo'ladi

public static string GetName<T>(this T item) where T : class
{
    if (item == null)
        return string.Empty;

    return typeof(T).GetProperties()[0].Name;
}

Endi siz uni chaqirishingiz mumkin:

new { MyClass.SomeProperty }.GetName();

Agar sizga ko'proq ishlash kerak bo'lsa, qiymatlarni keshlashingiz mumkin. Bu ikki nusxadagi savolga qarang O'zgaruvchining deklaratsiyasida fizik tarzda yozilganidek nomini qanday olish mumkin?

person nawfal    schedule 04.02.2013
comment
Bu erda eng yaxshi javob. Men xususiyatlarni aylantirmoqchi emasman, men haqiqiy xususiyatga asoslangan xususiyat nomini olishni xohlayman. Birinchi (yagona) xususiyat nomini istagan xususiyat bo'lgan anonim turdan foydalanish dahodir. - person Paul; 12.06.2014
comment
@Paul Men buning ortidagi daho emasman. Ikkinchidan, bu juda yaxshi refaktor emas. Aytmoqchimanki, agar siz mulk nomini o'zgartirsangiz, anonim tur asl nomini saqlab qoladi. Bunday holda, agar siz SomeProperty ni SomeProperty1 ga o'zgartirsangiz, anonim sinf yangilangan SomeProperty1 nomi o'rniga SomeProperty ni chop etadigan new { SomeProperty = SomeProperty1 } ga o'zgaradi. Men buni javobda aytib o'taman. - person nawfal; 12.06.2014
comment
Darn. Men hech qachon mulk nomini o'zgartirishni kutmayman, lekin agar o'zgartirgan bo'lsam, uni qayta ishlashni xohlayman. Menga xabar berganingiz uchun tashakkur. - person Paul; 12.06.2014
comment
Agar MyClass bajarilish vaqtida null bo'lsa, bu ham muvaffaqiyatsiz bo'ladi. Ifoda qilish usullari muvaffaqiyatli bo'ladi. Aksariyat hollarda bu muammo tug'dirmaydi, chunki siz boshqa joyda nol mos yozuvlar istisnosini olasiz, lekin buni ta'kidlash kerak. - person Rakuen42; 20.03.2015
comment
@Pedro77 avval kengaytma usulini statik sinfga yozishingiz kerak. - person nawfal; 09.06.2015

Ko'zgu yordamida ob'ektning xossalari ro'yxatini olishingiz mumkin.

MyClass o;

PropertyInfo[] properties = o.GetType().GetProperties(
    BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance
);

Har bir mulkda "SomeProperty" ni oladigan Name atributi mavjud.

person David    schedule 03.11.2009