238. IDynamicMetaObjectProvider DynamicObject

בפעמים הקודמות הכרנו קצת את השימוש בdynamic המאפשר לנו להפעיל מתודות על האובייקטים שלנו באופן דינאמי.

לFramework יש תמיכה בשינוי ההתנהגות של מה שקורה כשאנחנו קוראים לפונקציה בצורה דינאמית ע”י שימוש בdynamic.

הדבר הזה נעשה ע”י מימוש הממשק ששמו IDynamicMetaObjectProvider

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

לדוגמה נוכל לרשת מDynamicObject ולדרוס את הפונקציה TryInvokeMember. זו פונקציה שנקראת כל פעם שאנחנו מנסים לקרוא לפונקציה של האובייקט בצורה דינאמית:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class MyDynamicObject : DynamicObject
{
public override bool TryInvokeMember(InvokeMemberBinder binder,
object[] args,
out object result)
{
Console.WriteLine("{0} was called", binder.Name);
Console.WriteLine(args[0]);
return base.TryInvokeMember(binder, args, out result);
}
}

למשל, כשנכתוב את הקוד הבא:

1
2
dynamic sample = new MyDynamicObject();
sample.MyMethod("This compiles but throws an exception");

נקבל את התוצאה הבאה:

MyMethod was called
This compiles but throws an exception

זה קורה כי הדפסנו את הפרמטר הראשון ואת השם של הפונקציה. עף Exception כי קראנו לbase וזה מנסה לקרוא לפונקציה בצורה דינאמית סטנדרטית (כמו שראינו בטיפים הראשונים על dynamic).

המשך יום דינאמי טוב,

כי פונקציה זוגית סביב $ \mu $ זו פונקציה שמקיימת $ f(\mu - x) = f(x + \mu) $ ולא $ f(x-\mu) = f(x + \mu) $. אל תבזבזו על זה שעה מהמבחן שלכם במידה וכתוב אחרת על הטופס.

שתף