none
קבלת מידע מ List<object> RRS feed

  • שאלה

  • שלום לכולם

    יש לי פונקצייה אשר מחזירה List<object> שאני מקבל וצריך לדעת מה המאפיינים והמידע שיש בה.
    לדוגמא הרשימה מכילה מאפיין name ואת המידע של השם ומאפיין age ואת המידע שיש בו אבל אני מקבל רק את הרשימה בלי ההגדרה של האובייקט.
    ניסיתי כבר את :
    http://msmvps.com/blogs/andreysanches/archive/2007/04/25/how-to-find-objects-in-generics-with-list-find-method.aspx
    http://stackoverflow.com/questions/737151/how-to-get-the-list-of-properties-of-class
    אך ללא הועיל...

    יום שני 13 פברואר 2012 09:49

תשובות

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

    LIST היא רשימה של אלמנטים (במקרה הגנרי האלמנט יכול להיות כל אובייקט תיאורטית). לרשימה אין מאפיינים של AGE או NAME. לכן נשאלת השאלה מה בדיוק אתה מחפש ואני אנסה לנחש כמה אפשרויות.

    דרך אגב אם אתה רוצה לדעת איזה מאפיינים יש לרשימה כל מה שאתה צריך זה לגשת למחלקה שמגדירה את המופע של הרשימה ולבדוק:
    http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx

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

    אם זה המצב אז יש 2 אפשרויות ששוב אני לא בטוח מה אתה מחפש:

    1. האם אתה מחפש את הערך של המאפיינים עבור כל אחד מהאיברים ברשימה? אם כן פשוט תבצע לולאה על כל הרשימה (או תעבוד עם LINQ) ובתוך הלולאה תבדוק מה הערך של המאפיין. תוכל לראות כאן כיצד לבצע לולאה על כל האיברים:
    http://www.dotnetperls.com/list

    2. אם מה שאתה מחפש זה למצוא איזה מאפיינים יש לאובייקטים (מפני שהמחלקה שמגדירה את האובייקטים לא נגישה לך) אז השיטה לעבוד עם רפרקציה: GetProperties
    אתה יכול לבדוק את הישור הבא:
    http://www.csharp-examples.net/reflection-property-names/

    * נסה להבהיר את השאלה אם אתה מחפש משהו שלא כיסתי כאן :-)


    signature

    • נערך על-ידי pituachMVP, Moderator יום שני 13 פברואר 2012 15:00
    • סומן כתשובה על-ידי Ido Flatow. _Moderator יום שני 13 פברואר 2012 15:14
    • סימון כתשובה בוטל על-ידי Yoav Eyal יום שלישי 14 פברואר 2012 06:22
    • סומן כתשובה על-ידי Yoav Eyal יום שלישי 14 פברואר 2012 20:23
    יום שני 13 פברואר 2012 14:00
    מנחה דיון
  • אם אתה צריך לדעת אילו מאפיינים יש לאובייקט נתון, לדוגמה איבר ברשימה, תוכל לבצע משהו בסגנון הבא:

    object item = list[0];
    var properties = item.GetType().GetProperties(BindingFlags.Public | BindingFlags.Static);


    Please mark posts as answers/helpful if it answers your question.
    Senior Consultant on WCF, ASP.NET, Siverlight, and Entity Framework. Author of Microsoft's Official WCF 4 Course. Co-author of the Microsoft HPC/Azure burst whitepaper.
    Visit my blog: http://blogs.microsoft.co.il/blogs/idof

    • סומן כתשובה על-ידי Yoav Eyal יום שלישי 14 פברואר 2012 20:24
    יום שלישי 14 פברואר 2012 08:11
    מנחה דיון
  • * אם אתה עובד עם מחלקת LIST המובנית ולא ביצעת שינויים (ודיי בטוח שזה המצ לאור השאלה) אז תזכור 1. שכל המחלקה חייבת להיות רק של סוג אלמנט מסויים. 2. זו מחלקה גנרית אבל ברגע שהגדרת מופע לרשימה LIST הרי שגם היית חייב להגדיר את המחלקה של האלמנטים שישמרו ברשימה! כך שאתה יודע מה יש לך ברשימה בדיוק. למשל אם הגדרת מופע של LIST כך:

    List<ObjName> MyList = new List<ObjName>();
    

    * כמו שאתה רואה מערכת הקודים כאן דיי שווה לת_ת אז את הדוגמה צירפתי בנפרדתי (זה מה שקורה כשאין התאמה לעברית במערכת טלריק)

    במקרה זה אתה יודע מה שם המחלקה של האלמנטים ברשימה והרי השם הוא ObjName ולכן אתה יכול לעבוד כמו שהראתי לך קודם

     = =  = = = =

    יש לי הרגשה שאתה טוען לרשימה אלמנטים כלליים בכלל מסוג OBJECT ושוכח שזה מופע לכל דבר של מחלקה בשם OBJECT. לכן שם האובייקט ברשימה הוא OBJECT :-)

    יכול להיות שהאובייקטים שלך מקורן במופע של אלמנט אחר שביצעת למשל CAST והפכת אותו לאלמנט כללי OBJECT. במקרה כזה מוצאים את הסוג של האלמנט בתוך האובייקט על ידי: GetType

    ז"א בתוך הלולאה על כל האיברים של הרשימה אתה פשוט בודק עבור עבור כל איבר מה הסוג שלו. למשל ראה הקטע קוד הבא:

    http://ariely.info/Blog/tabid/83/EntryId/71/how-to-get-the-type-of-each-OBJECT-in-a-list.aspx

    וכמובן שאחרי שיש לך את השם של סוג האלמנט אתה יכול למצוא את כל המאפיינים שלו בצורה שהראתי מעל


    signature


    • נערך על-ידי pituachMVP, Moderator יום שלישי 14 פברואר 2012 09:14
    • סומן כתשובה על-ידי Yoav Eyal יום שלישי 14 פברואר 2012 20:22
    יום שלישי 14 פברואר 2012 09:00
    מנחה דיון
  • תודה רבה לכולם.

    מהצירוף של הכל הגעתי בסוף לזה:

     SomeDll.EmployeeDll ed = new SomeDll.EmployeeDll();
                List<object> liObj = ed.getList();
    
                foreach (var item in liObj)
                {
                    var properties = item.GetType().GetProperties();
                    foreach (var names in properties)
                    {
                        Console.WriteLine(names.Name);
                    }
                }
    זה פתר לי את הבעיה!!!

    • סומן כתשובה על-ידי Yoav Eyal יום שלישי 14 פברואר 2012 20:24
    יום שלישי 14 פברואר 2012 20:22

כל התגובות

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

    LIST היא רשימה של אלמנטים (במקרה הגנרי האלמנט יכול להיות כל אובייקט תיאורטית). לרשימה אין מאפיינים של AGE או NAME. לכן נשאלת השאלה מה בדיוק אתה מחפש ואני אנסה לנחש כמה אפשרויות.

    דרך אגב אם אתה רוצה לדעת איזה מאפיינים יש לרשימה כל מה שאתה צריך זה לגשת למחלקה שמגדירה את המופע של הרשימה ולבדוק:
    http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx

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

    אם זה המצב אז יש 2 אפשרויות ששוב אני לא בטוח מה אתה מחפש:

    1. האם אתה מחפש את הערך של המאפיינים עבור כל אחד מהאיברים ברשימה? אם כן פשוט תבצע לולאה על כל הרשימה (או תעבוד עם LINQ) ובתוך הלולאה תבדוק מה הערך של המאפיין. תוכל לראות כאן כיצד לבצע לולאה על כל האיברים:
    http://www.dotnetperls.com/list

    2. אם מה שאתה מחפש זה למצוא איזה מאפיינים יש לאובייקטים (מפני שהמחלקה שמגדירה את האובייקטים לא נגישה לך) אז השיטה לעבוד עם רפרקציה: GetProperties
    אתה יכול לבדוק את הישור הבא:
    http://www.csharp-examples.net/reflection-property-names/

    * נסה להבהיר את השאלה אם אתה מחפש משהו שלא כיסתי כאן :-)


    signature

    • נערך על-ידי pituachMVP, Moderator יום שני 13 פברואר 2012 15:00
    • סומן כתשובה על-ידי Ido Flatow. _Moderator יום שני 13 פברואר 2012 15:14
    • סימון כתשובה בוטל על-ידי Yoav Eyal יום שלישי 14 פברואר 2012 06:22
    • סומן כתשובה על-ידי Yoav Eyal יום שלישי 14 פברואר 2012 20:23
    יום שני 13 פברואר 2012 14:00
    מנחה דיון
  • קודם כל תודה על התשובה המפורטת.
    ניסיתי את מה שכתבת וכנראה שהניסוח באמת לא היה נכון. הכוונה שלי באמת הייתה למצוא איזה מאפיינים יש לאובייקט אבל כשניסיתי את הלינק המצורף
    http://www.csharp-examples.net/reflection-property-names/ יש שם דרישה להגדיר במפורש את שם האובייקט:

    propertyInfos = typeof(MyClass).GetProperties(BindingFlags.Public |
                                                  BindingFlags.Static);

    כשלי יש רק את הרשימה שקיבלתי מסוג object (הרשימה מתקבלת משאילתת EF אשר מתבצעת ב class אחר).

    בהחלט יכול להיות שאני מפספס משהו אבל אני לא מצליח למצוא מה...

    יום שלישי 14 פברואר 2012 06:37
  • אם אתה צריך לדעת אילו מאפיינים יש לאובייקט נתון, לדוגמה איבר ברשימה, תוכל לבצע משהו בסגנון הבא:

    object item = list[0];
    var properties = item.GetType().GetProperties(BindingFlags.Public | BindingFlags.Static);


    Please mark posts as answers/helpful if it answers your question.
    Senior Consultant on WCF, ASP.NET, Siverlight, and Entity Framework. Author of Microsoft's Official WCF 4 Course. Co-author of the Microsoft HPC/Azure burst whitepaper.
    Visit my blog: http://blogs.microsoft.co.il/blogs/idof

    • סומן כתשובה על-ידי Yoav Eyal יום שלישי 14 פברואר 2012 20:24
    יום שלישי 14 פברואר 2012 08:11
    מנחה דיון
  • * אם אתה עובד עם מחלקת LIST המובנית ולא ביצעת שינויים (ודיי בטוח שזה המצ לאור השאלה) אז תזכור 1. שכל המחלקה חייבת להיות רק של סוג אלמנט מסויים. 2. זו מחלקה גנרית אבל ברגע שהגדרת מופע לרשימה LIST הרי שגם היית חייב להגדיר את המחלקה של האלמנטים שישמרו ברשימה! כך שאתה יודע מה יש לך ברשימה בדיוק. למשל אם הגדרת מופע של LIST כך:

    List<ObjName> MyList = new List<ObjName>();
    

    * כמו שאתה רואה מערכת הקודים כאן דיי שווה לת_ת אז את הדוגמה צירפתי בנפרדתי (זה מה שקורה כשאין התאמה לעברית במערכת טלריק)

    במקרה זה אתה יודע מה שם המחלקה של האלמנטים ברשימה והרי השם הוא ObjName ולכן אתה יכול לעבוד כמו שהראתי לך קודם

     = =  = = = =

    יש לי הרגשה שאתה טוען לרשימה אלמנטים כלליים בכלל מסוג OBJECT ושוכח שזה מופע לכל דבר של מחלקה בשם OBJECT. לכן שם האובייקט ברשימה הוא OBJECT :-)

    יכול להיות שהאובייקטים שלך מקורן במופע של אלמנט אחר שביצעת למשל CAST והפכת אותו לאלמנט כללי OBJECT. במקרה כזה מוצאים את הסוג של האלמנט בתוך האובייקט על ידי: GetType

    ז"א בתוך הלולאה על כל האיברים של הרשימה אתה פשוט בודק עבור עבור כל איבר מה הסוג שלו. למשל ראה הקטע קוד הבא:

    http://ariely.info/Blog/tabid/83/EntryId/71/how-to-get-the-type-of-each-OBJECT-in-a-list.aspx

    וכמובן שאחרי שיש לך את השם של סוג האלמנט אתה יכול למצוא את כל המאפיינים שלו בצורה שהראתי מעל


    signature


    • נערך על-ידי pituachMVP, Moderator יום שלישי 14 פברואר 2012 09:14
    • סומן כתשובה על-ידי Yoav Eyal יום שלישי 14 פברואר 2012 20:22
    יום שלישי 14 פברואר 2012 09:00
    מנחה דיון
  • תודה רבה לכולם.

    מהצירוף של הכל הגעתי בסוף לזה:

     SomeDll.EmployeeDll ed = new SomeDll.EmployeeDll();
                List<object> liObj = ed.getList();
    
                foreach (var item in liObj)
                {
                    var properties = item.GetType().GetProperties();
                    foreach (var names in properties)
                    {
                        Console.WriteLine(names.Name);
                    }
                }
    זה פתר לי את הבעיה!!!

    • סומן כתשובה על-ידי Yoav Eyal יום שלישי 14 פברואר 2012 20:24
    יום שלישי 14 פברואר 2012 20:22