147. Obtaining a MethodInfo

הכרנו פעם שעברה קצת את MethodInfo.

יש מספר דרכים להשיג MethodInfo. הדרך הקלה ביותר היא להשתמש בפונקציה GetMethods של Type.

כפי שראינו פעם שעברה, פונקציה זו מחזירה לנו את כל הMethodInfoים הpublic שיש לTypeמסוים. (גם סטטיות וגם של instance)

אבל אם לא מעניינות אותנו כל המתודות? נוכל להשתמש בoverload של הפונקציה GetMethods שמקבל BindingFlags. זהו enum שבעזרתו אנחנו מסוגלים לציין את המתודות שאנחנו מעוניינים לחפש:

למשל:

1
2
3
MethodInfo[] publicNonStaticMethods =
typeof (int).GetMethods(BindingFlags.Public |
BindingFlags.Instance);

יחזיר לנו את כל המתודות שהן public ושל instance של הטיפוס int.

1
2
3
4
MethodInfo[] nonPublicMethods =
typeof (int).GetMethods(BindingFlags.NonPublic |
BindingFlags.Static |
BindingFlags.Instance);

יחזיר לנו את כל המתודות שהן לא public (כן, אפשר לעשות את זה!)

1
2
MethodInfo[] emptyMethods =
typeof (int).GetMethods(BindingFlags.Public);

לא יחזיר לנו כלום, כי לא ציינו אם אנחנו מעוניינים בפונקציות סטטיות או של instance.

(ראו גם טיפ מספר 22 אם אתם לא מכירים Enum flags)


דרך נוספת להשיג MethodInfo היא באמצעות הפונקציה GetMethod:

1
MethodInfo contains = typeof (string).GetMethod("Contains");

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

1
2
3
MethodInfo indexOf =
typeof (string).GetMethod("IndexOf");
// AmbiguousMatchException: Ambiguous match found.

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

1
MethodInfo indexOf = typeof (string).GetMethod("IndexOf", new[] {typeof(string)});

יש עוד כמה overloadים שמאפשרים לנו להיות יותר ספציפיים ולהגיד גם את הBindingFlags שלחפש בעזרתם את המתודה וכו’.

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

שתף