ABA


"|C#| שאלה לגבי Generics... צריך עזרה"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #14549 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 14549
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   17:51   22.01.08   
אל הפורום  
  |C#| שאלה לגבי Generics... צריך עזרה  
 
   שלום,
נתקלתי היום במשהו שהעלה בי תהיה קטנה.
אם אני עושה מחלקה גנרית ב C#, בתכנית CONSOLE APPLICAION ואז אני צריך לקלוט לה משהו למשתנה שהוא גנרי, אני צריך לעשות PARSE אך לא ניתן לדבר באיזה PARSER להשתמש. אני חשבתי על להשתמש בREFLECTION אבל הפיתרון שלי, למרות שעבד, היה מסובך. יכול להיות שיש דרך פשוטה יותר.

יש למישהו רעיון?

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  תפרט יותר על הבעיה עידן_הכלי 22.01.08 19:40 1
  השם יירחם ימות המשיח הגיעו לירן שאל שאלה XD צילמתי חח|V| akoka 22.01.08 19:51 2
  לא אקטואלי כבר :) Sn00py  22.01.08 21:49 3
     Late Binding FTW :] DLN 23.01.08 15:52 4
  הבנתי את השאלה שלך... יש מצב להסבר לפתרון שלך? :} -DoTaN- 23.01.08 20:56 5
     הרעיון הוא Late Binding Sn00py  23.01.08 21:12 6
         אהה הבנתי :)) תודה :} -DoTaN- 23.01.08 21:53 7
         הסבר קצר בכל מקרה למי שלא מתמצא DLN 23.01.08 22:31 8
             גאון שלי :) יום אחד נשתלט על העולם אני ואתה. Sn00py  24.01.08 11:10 9
                 לא חסר תפקידים DLN 24.01.08 13:45 10
                     בינתיים אני זה שהתקבל לקורס תכנות =] Fly2High 24.01.08 17:26 11
                         בינתיים :] DLN 24.01.08 19:27 12

       
עידן_הכלי

   19:40   22.01.08   
אל הפורום  
  1. תפרט יותר על הבעיה  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
akoka

   19:51   22.01.08   
אל הפורום  
  2. השם יירחם ימות המשיח הגיעו לירן שאל שאלה XD צילמתי חח|V|  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   21:49   22.01.08   
אל הפורום  
  3. לא אקטואלי כבר :)  
בתגובה להודעה מספר 0
 
  

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   15:52   23.01.08   
אל הפורום  
  4. Late Binding FTW :]  
בתגובה להודעה מספר 3
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
-DoTaN-

   20:56   23.01.08   
אל הפורום  
  5. הבנתי את השאלה שלך... יש מצב להסבר לפתרון שלך? :}  
בתגובה להודעה מספר 0
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   21:12   23.01.08   
אל הפורום  
  6. הרעיון הוא Late Binding  
בתגובה להודעה מספר 5
 
   ערכתי לאחרונה בתאריך 23.01.08 בשעה 21:13 בברכה, Sn00py
 
להשתמש ב Reflection על מנת לחפש את הפונקצית Parse לטיפוס ממש בזמן ריצה. אני מצרף את הקוד ואם משהו לא ברור אני/אלון נענה


using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace ConsoleApplication13
{
public class blah<T>
{
private T _blahinfo;
public T blahinfo
{
get
{
return _blahinfo;
}
set
{
Type theType = typeof(T);
MethodInfo myParser = theType.GetMethod("Parse", new Type[] { Type.GetType("System.String") });
object obj = Activator.CreateInstance(theType);
_blahinfo = (T) myParser.Invoke(obj, new object[] { value.ToString() });
}
}
}
class Program
{
static void Main(string[] args)
{
}
}
}

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
-DoTaN-

   21:53   23.01.08   
אל הפורום  
  7. אהה הבנתי :)) תודה :}  
בתגובה להודעה מספר 6
 
   לא חושב שיש דרך אחרת :|


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   22:31   23.01.08   
אל הפורום  
  8. הסבר קצר בכל מקרה למי שלא מתמצא  
בתגובה להודעה מספר 6
 
   הקוד המשמעותי פה הוא

set
{
Type theType = typeof(T);
MethodInfo myParser = theType.GetMethod("Parse", new Type[] { Type.GetType("System.String") });
object obj = Activator.CreateInstance(theType);
_blahinfo = (T) myParser.Invoke(obj, new object[] { value.ToString() });
}

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

בשורה השנייה יוצרים אובייקט MethodInfo שמכיל, כמו שהבנתם בטח, מידע על שיטה מסויימת ששייכת לטיפוס שמוכל בtheType.
היא מקבלת כפרמטרים את החתימה של השיטה: את השם שלה, במקרה הזה Parse, ומערך של Typeים שמכיל את סוגי הפרמטרים שהשיטה מקבלת, במקרה של Parse היא מקבלת רק string אחד.
יצרתי את המערך בתוך ההגדרה מטעמי אסטתיקה, כי בכל מקרה לא משתמשים בו אחר כך, לא פה ספציפית לפחות.

בשורה השלישית אני יוצר אובייקט מאותו מהסוג שמכיל את השיטה שאני רוצה, ההבדל היחיד הוא שהוא נוצר בזמן ריצה (זה נקרא Late Binding) ולא בזמן קומפלציה.
במקרה של Parse השיטה היא סטטית אז זה ממש לא משנה, בהמשך פשוט מתעלמים מהאובייקט הזה, אפשר פשוט להגדיר אותו כnull כדי להקטין תקורה (למרות שאני חושב שבמקרה הזה זה נחשב כאילו אין רפרנס בכלל לאובייקט הזה והוא נמחק ע"י הGC)

ולבסוף, בשורה האחרונה אני מסיים את הset בקאסט לטיפוס הג'נרי לobject שהשיטה Invoke מחזירה.
השיטה Invoke שייכת לאובייקט MethodInfo ומקבלת את האובייקט שיקרא לשיטה, אבל כפי שכתבתי קודם מכיוון שParse היא מתודה סטטית האובייקט הזה לא משמש לכלום, והיא מקבלת כפרמטר השני מערך של objectים שמכיל את הערכים שמועברים לפונקציה. לא להתבלבל, ההגדרה בשורה השנייה מכילה את המידע על הטיפוסים שהפונקציה מקבלת, כלומר החתימה שלה, ההגדרה בשורה הרביעית מכילה את הערכים שמועברים!
גם פה מטעמי אסתטיקה יצרתי את המערך כבר בתוך ההגדרה.
value מומר פה לstring מכיוון שאי אפשר לעשות המרה לא מפורשת בין object לstring.
זהו.
כל הדבר הזה פחות או יותר מקביל ללכתוב


_blahinfo=T.Parse(value.ToString());

אבל זה לא אפשרי לצערנו חח


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות
   11:10   24.01.08   
אל הפורום  
  9. גאון שלי :) יום אחד נשתלט על העולם אני ואתה.  
בתגובה להודעה מספר 8
 
   וגם שחר... צריך למצוא לו תפקיד.

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   13:45   24.01.08   
אל הפורום  
  10. לא חסר תפקידים  
בתגובה להודעה מספר 9
 
   נהג, שרת, אב בית, מנקה, איש אספרסו,


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Fly2High

   17:26   24.01.08   
אל הפורום  
  11. בינתיים אני זה שהתקבל לקורס תכנות =]  
בתגובה להודעה מספר 10
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות
   19:27   24.01.08   
אל הפורום  
  12. בינתיים :]  
בתגובה להודעה מספר 11
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net