148. Invoking a MethodInfo

בהמשך לשבוע המשתקף לטובה,

ראינו איך אפשר להשיג MethodInfo.

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

איך זה מתבצע? בעזרת הפונקציה Invoke. פונקציה זו מאפשרת לנו לקרוא לפונקציה שמייצג הMethodInfo עם פרמטרים מתאימים.

אם הפונקציה שלנו סטטית, השימוש די פשוט:

1
2
3
4
5
6
MethodInfo parse =
typeof (int).GetMethod("Parse", new[] {typeof(string)});
object result = parse.Invoke(null, new object[] {"42"});// 42
// Like object result = int.Parse("42");

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

1
2
3
4
5
6
MethodInfo substring =
typeof (string).GetMethod("Substring", new[] {typeof(int)});
object result = substring.Invoke("Pink Floyd", new object[] {1}); // ink Floyd
// Like object result = "Pink Floyd".Substring(1);

מגניב, לא?


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

יש לבעיה זו פתרון ואותו נראה בהמשך…

המשך יום משתקף טוב

שתף