שמות Properties כמחרוזות – חלק 2

August 4, 2008

להלן בעיה – בהנתן Property כלשהו, נניח ששמו FirstName, עליכם להעביר למתודה את שם ה-Property כמחרוזת, תחת המגבלות הבאות:

  1. אינכם יכולים לרשום במפורש את שם ה-Property כמחרוזת (“FirstName”)
  2. אינכם יכולים להשתמש ב-GetProperties, איכשהו לאתר את ה-PropertyInfo ולחלץ את שמו ממאפיין Name (לדוגמה – איתור ה-PropertyInfo הראשון שמתחיל ב-F ואורך שמו הוא 9)

לפני כשנתיים נתקלתי בבעיה זו, כאשר וחיפשתי דרך לפתור את הבעיה שהוצגה בפוסט הקודם – העברה של שמות מאפיינים למתודה וקבלת ערכיהם (אז לא עלה בדעתי להשתמש ב-delegate).

פתרון לבעיה לעיל לא מצאתי והתשובה שקיבלתי מאנשי מיקרוסופט היתה – צור מאפיין מחרוזתי שיכיל את שם המאפיין שאותו אתה רוצה לחלץ ותשתמש בו:

public string Name { get; set; }
public string NameDescriptor
   { get { return "Name"; } }

כך, הם טענו, המחרוזת המייצגת כתובה יחסית קרוב למאפיין עצמו ולכן, כאשר נרצה לשנות את שם המאפיין עצמו, נשים לב למאפיין ה”מיוחד” ונשנה גם אותו (בהנחה ונבין למה הוא שם). דרך חדשה ויצירתית משהו ל-Strongly Type.

אז קחו דקה שתיים, נסו לחשוב האם יש לכם רעיון קצת פחות יצירתי וקצת יותר נורמלי לפתור בעיה זו.

כשתתעייפו, תרדו למטה …

.

.

.

.

.

.

.

.

.

.

.

.

.

הפתרון – שימוש ב-Expression Tree וב-Lambda Expression:

Expression<Func<SomeClass, string>> exp = (obj=>obj.SomeProperty);
string propertyName = (exp.Body as MemberExpression).Member.Name;
Add comment
facebook linkedin twitter email

Leave a Reply

Your email address will not be published.

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>