161. MemberInfo DeclaringType and ReflectedType

בהמשך לטיפים הקודמים,

הכרנו את MethodInfo ואת PropertyInfo. ראינו שאם אנחנו קוראים לפונקציה GetMethods או GetProperties של Type אנחנו מקבלים גם Methods או Properties ששייכים לטיפוסים שאנחנו יורשים מהם.

למשל, ראינו שאם אנחנו קוראים לGetMethods אנחנו מקבלים גם 4 פונקציות מObject:

1
2
3
4
// System.String ToString()
// Boolean Equals(System.Object)
// Int32 GetHashCode()
// System.Type GetType()

נניח שאנחנו יוצרים טיפוס משלנו ודורסים את ToString. האם נוכל לדעת עפ"י GetMethods האם הפונקציה היא של הטיפוס שלנו או של טיפוס אחר?


כדי לענות על שאלה זו – נציג את MemberInfo – זהו טיפוס שכל המחלקות מReflection שפגשנו יורשות ממנו. יורשות ממנו MethodInfo, PropertyInfo ואפילו Type.

לטיפוס זה שני Properties מעניינים:

ReflectedType וDeclaringType. הראשון מייצג את הType שעשינו עליו Reflection כדי לקבל את הMemberInfo, למשל:

1
2
3
4
5
6
7
8
9
10
11
12
IEnumerable<MethodInfo> publicMethods =
typeof (Person).GetMethods();
IEnumerable<Type> reflectedTypes =
publicMethods.Select(method => method.ReflectedType).Distinct();
foreach (Type reflectedType in reflectedTypes)
{
Console.WriteLine(reflectedType.Name);
}
// Person

זה יכול להיות שימושי אם נכתוב, למשל, פונקציה המקבלת MethodInfo ותרצו לדעת מאיזה Type היא התקבלה ע"י Reflection.

הProperty השני מייצג את הType אליו שייך הMemberInfo. אם, למשל, נריץ את הקוד הבא על הטיפוס Person מאתמול:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
IEnumerable<MethodInfo> publicMethods =
typeof (Person).GetMethods();
foreach (MethodInfo methodInfo in publicMethods)
{
Console.WriteLine("{0} - {1}", methodInfo, methodInfo.DeclaringType);
}
// Int32 get_Age() - Person
// Void set_Age(Int32) - Person
// System.String get_FirstName() - Person
// Void set_FirstName(System.String) - Person
// System.String get_LastName() - Person
// Void set_LastName(System.String) - Person
// Void Talk() - Person
// System.String ToString() - System.Object
// Boolean Equals(System.Object) - System.Object
// Int32 GetHashCode() - System.Object
// System.Type GetType() - System.Object

נשים לב שהמתודות שהוספנו בPerson אכן שייכות לPerson, והשאר שייכות לobject.

אם נדרוס את ToString, למשל, נוכל לקבל משהו כזה:

1
2
3
4
5
6
MethodInfo toString = typeof (Person).GetMethod("ToString");
if (toString.DeclaringType == typeof(Person))
{
// true
}

המשך יום הצהרה משוקף לטובה

שתף