c# delegates

c# delegates

האם אפשר לעשות degegate שמחזיר bool אבל מקבל משהו לא מוגדר (לא ידוע כמה פרמטרים ומאיזה טיפוס)?
 

demultiplexer

New member
params[] או object[]

אני לא סגור על זה אבל זה לפחות ייתן לך כיוון... params[] אמור להיות מערך בגודל לא קבוע מראש של משתנים מסוגים שונים. קרא על זה. object[] - אני חושב שתוכל גם להשתמש במנגון boxing וunboxing ולשלוח את כל המשתנים שאתה רוצה למערך של objects ואז אתה מבצע boxing וכשאתה צריך להשתמש בהם אתה צריך להמיר אותם חזרה לסוג המקורי שלהם וזה נקרא unboxing ואז אתה יכול להשתמש במערך אחד ולהכיל בו את כל סוגי המשתנים. רק שתצטרך אח"כ לדאוג להחזיר אותם לסוג המקורי. מקווה שננתי לך כיוון מספיק בשביל להתחיל לחפש.
 

Justin Angel

New member
קה פרובלמה מואי צ'יקיטה?

כמו שאמרו ניתן לקבל params. יש לעומת זאת פתרון הרבה יותר ספציפי ונכון מבחינת בניית התוכנה. ברור שבאיזהשהו נקודה אתה יודע מה הפרמטרים שאתה צריך. באיזהשהו שלב במהלך העבודה של התוכנית אתה צריך אבסטרקציה כלשהי כדי באמת לעבוד מול איזהשהו Delegate יהיה אשר יהיה. לפי דעתי, את המקום הזה באפליקציה צריך לבודד החוצה ולדאוג שרק הוא יהיה אבסטרקטי שידע לטפל בכל דבר מכל סוג. אפשר לעשות את זה באמת ע"י שילוב של פונקציה שיכולה לקבל כל delegate באשר הוא, לקבל params של טיפוסים בלתי-ידועים ושתפעיל באמצעות אותם params את ה-delegate באמצעות DynamicInvoke.
public static void OperateSomeDelegateIDontKnowWhich(Delegate DelegateToRun, params object[] Parameters) { DelegateToRun.DynamicInvoke(Parameters); }​
הפתרון הזה מאפשר לך באמת לרכז את האבסטרקציה של סוגי ה-Delegateים השונים למקום אחד בלבד באפליקציה. חשוב להזכיר, שלמרות שהפתרון הזה מונע שימוש מיותר בקוד בלא-רלוונטי בכך שהוא תוחם אותו במקום ספציפי, הוא עדיין בפני עצמו לא פתרון טוב. הוא פתרון טוב בזה שהוא מגביל את הטעויות שמתבצעות. הוא לא פתרון טוב בזה שהוא מעיד על ארכיטקטורה לקוייה ועל אי-מחסור בוטה ב-Design Patterns למיניהן שנועדו להקל על מצבים שדורשים DynamicInvoke. אם תרצה, תוכל לפרט מה המצב שהביא אותך להחלטה כזאת שבו אתה צריך להריץ כל מיני דברים בלי לדעת מה הם ונראה אם יש פתרון יותר OO לזה. (לא בהכרח שיש למשל כמו במצבים כמו לוגרים, אבטחה ועוד כמה מצבים נפוצים אחרים שאין פתרון, אבל אפשר לנסות)
 
בסוף אני לא משתמש ב-delegate הזה

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