146. MethodInfo

עד כה התעסקנו בעיקר בשימוש במחלקה Type ולכן בעיקר ביחסים בין מחלקות/ממשקים.

דבר נוסף שאפשר לעשות באמצעות Reflection הוא לגלות מידע על דברים שמרכיבים את הType כמו הMemberים שמרכיבים Type.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Type intType = typeof (int);
foreach (MethodInfo methodInfo in intType.GetMethods())
{
Console.WriteLine(methodInfo);
}
// Int32 CompareTo(System.Object)
// Int32 CompareTo(Int32)
// Boolean Equals(System.Object)
// Boolean Equals(Int32)
// Int32 GetHashCode()
// System.String ToString()
// System.String ToString(System.String)
// System.String ToString(System.IFormatProvider)
// System.String ToString(System.String, System.IFormatProvider)
// Int32 Parse(System.String)
// Int32 Parse(System.String, System.Globalization.NumberStyles)
// Int32 Parse(System.String, System.IFormatProvider)
// Int32 Parse(System.String, System.Globalization.NumberStyles, System.IFormatProvider)
// Boolean TryParse(System.String, Int32 ByRef)
// Boolean TryParse(System.String, System.Globalization.NumberStyles, System.IFormatProvider, Int32 ByRef)
// System.TypeCode GetTypeCode()
// System.Type GetType()

שימו לב שבעצם רשמנו את כל המתודות שיש לint. מגניב ביותר!


אז מהו בעצם אותו MethodInfo המסתורי?

כפי שאפשר לנחש, זהו אובייקט המייצג את המתודה שלנו – או במילים יותר יפות – הMetaData של המתודה שלנו.

מה אפשר לעשות איתו? דברים די הגיוניים, למשל לגלות את הפרמטרים שלו:

1
2
3
4
5
6
7
8
9
10
MethodInfo daysInMonth =
typeof (DateTime).GetMethod("DaysInMonth");
foreach (ParameterInfo parameter indaysInMonth.GetParameters())
{
Console.WriteLine(parameter);
}
// Int32 year
// Int32 month

או לגלות את ערך ההחזר שלו:

1
2
Console.WriteLine(daysInMonth.ReturnType);
// System.Int32

אפשר לבדוק גם האם המתודה סטטית:

1
Console.WriteLine(daysInMonth.IsStatic); // True

או לבדוק האם היא public וכו’:

1
2
Console.WriteLine(daysInMonth.IsPublic); // True
Console.WriteLine(daysInMonth.IsPrivate); // False

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

למשל:

1
2
3
4
public static Person SwapPeople(ref Person first, ref Person second)
{
// ...
}

אם נריץ את אותו קוד:

1
2
3
4
5
6
7
8
9
MethodInfo swapPeople =
typeof (Person).GetMethod("SwapPeople");
foreach (ParameterInfo parameterInfo in swapPeople.GetParameters())
{
Console.WriteLine(parameterInfo);
}
// MyNamespace.Person& first
// MyNamespace.Person& second

שימו לב ל&. מזכיר קצת את ימי C++

שיהיה שבוע השתקפויות טוב

שתף