בעיה

בעיה

בעיה שאני אפילו לא יודע להגדיר אותה בשם.
יש לי אובייקט לקוח ובו שדות רבים. firstName, lastName, email ועוד.
פונקציה מקבלת את האובייקט הנ"ל, עם כל השדות שלו, פלוס שדה נוסף, שמכיל טקסט. הטקסט הוא שם של שדה שאותו אני רוצה להדפיס. למשל 'lastName' . אבל זה משתנה בכל פעם. יכול להיות 'email' ...

השאלה: איך אני מוצא באובייקט את השדה ששמו X ?
אני רוצה לקבל מהאובייקט את הערך שנמצא בשדה ששמו X .
רעיונות?
 
אני מניח שהוא בסדר. לא מכיר אותו אישית.

מה שעשיתי בינתיים (ובוא נשאיר את זה בינינו), זה case על כל 6 השדות האפשריים. זה די מכוער, אבל עובד ומהר. אני חושש שרפלקשן יהיה איטי יותר, לא? אני אחפש קצת בגוגל.
&nbsp
 

nocgod

New member
אז במקום לעשות מכוער

// check that yourObject is not nullvar properties = yourObject.GetType().GetProperties(yourObject);
var prop = properties.FirstOrDefault(
x => x.Name.Equals(neededPropertyName)); // I think you can avoid the linq by using the GetProperty methodstring data = null;if (prop != null){ data = prop.GetValue(yourObject);}if (data != null){ // use data here}else{ // deal with missing data}
 

Royi Namir

New member
חסר BINDINGFLAGS וכו אבל כמו שאמרת אפשר עם GetProp

בכל מקרה :

void Main(){
var p = new P(){Name = "123"};var prop = p.GetType().GetProperty("Name"); string data = null;if (prop != null){ data = (string)prop.GetValue(p,null); data.Dump();}if (data != null){ }else{ }}public class P{ public string Name { get; set; }}// Define other methods and classes here
 

Royi Namir

New member
אם רק היית יודע כמה דברים נעשים ב REFELECTION מבלי שתשים לב

גם ב MVC , גם ב WEBAPI , ובכלל ב ASPNET
אין בזה שום דבר רע.
&nbsp
 

arielRuuubi

New member
+1

כבר 2 פתרונות שהיו אמורים להיות ממש מורכבים עשיתי ממש פשוט ע"י REFLECTION
לא יודע למה כולם עושים את זה "מסובך" ו"בעייתי" ו"מסוכן", אשכרה בפעם הראשונה רבו איתי בעבודה ע"ז...מזל שאני קרציה יותר נוראית :)
 

marvin2

New member
ומה בעניין הביצועים ?

אם נניח שאני מחליף CASE של שלוש אפשרויות ובריפלקשיין, וזה יושב בקוד שרץ *המון* . אתה באמת ובתמים תעשה את זה בריפלקשיין ?
 

nocgod

New member
אולי רפלקשין לא תהיה הדרך הכי אופטימלית מבחינת ביצועים

אבל ללא ספק הדרך הכי maintainable, readable ו extendable
אולי בכלל המבנה של של האובייקט הזה לא נכון, ובמקום לשמור string עם שם שדה שצריך להדפיס, להעביר ולשמור lambda שמדפיסה את השדה הנחוץ.
 
ואכן זה מה שקרה.

מאחר והקוד הזה רץ אלפי פעמים והמשתמש מחכה לו, הביצועים חשובים.
עשיתי עם רפלקשן כפי שהיציעו לי כאן, ולפחות למדתי משהו, אבל זה הוסיף זמן משמעותי לתהליך, ולכן חזרתי ל switch המכוער (אבל מהיר יותר).
אבל ללמוד זה תמיד חשוב, ואולי במקרים אחרים זה יתאים יותר.
 

Miki Watts

New member
רוב הסיכויים שהיית יכול לשפר את הביצועים בצורה משמעותית ע"י

ביצוע caching ל properties שאתה משתמש בהם ב reflection.אני בניתי מערכת תקשורת שהייתה מבוססת על reflection לצורך העברה ויצירה של מחלקות ואחרי כמה ביצוע שיפורים בעזרת פרופיילרים, הייתי יכול לדחוף מיליוני רשומות בתוך מספר דקות.
 

arielRuuubi

New member
ובכן

במציאות, השרתים היום כ"כ מהירים שאין שום משמשעות כמעט לביצועים ברמת קוד שרת.
&nbsp
יצא לי כמה פעמים לשפר קוד ברמה של 50% אפילו, אבל מדובר מ50 MS ל30MS, וכד', זה לא משמעותי, ולכן כדאידיאולוגיה אני לא מתייחס יותר לביצועים ברמת שרת (פרט לטמטום ממש או הבדלים של שניה וכד').
&nbsp
מעבר לכך שבכתיבה נכונה אתה יכול אפילו לשפר ביצועים
 

Admini

New member
אתה טועה כשמדובר באתרים גדולים יותר

צד השרת אולי רץ מהר אבל חומרה זה עדיין לא דבר זול כ"כ.
כשיש לך אתרים גדולים, ההבדל בין 50-30ms הוא משמעותי בכמות הגולשים שיכול "לסחוב" שרת בודד.
 

marvin2

New member
מה אמרת בזה?

אתה משקיע רק בחומרה ? לא בקוד? זו שטות מוחלטת.
 

hookedatwalla

New member
אז תכיר אותו

שים ATTRIBUTE מעל המשתנה שאתה משנה
ותרפלקש אותו
זה השיטה הנכונה לעבוד
 
למעלה