294. Anonymous types and generic types

בהמשך לHackים הקודמים, לפעמים יש לנו טיפוס אנונימי ואנחנו מעוניינים ליצור ממנו מבנה אחר, למשל ליצור רשימה שמכילה מספר אובייקטים אנונימיים כאלה.

(ראו גם טיפ מספר 90)

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

כדי לעשות משהו כזה, היינו רוצים כתוב משהו כמו הקוד הזה:

1
2
3
4
5
6
7
8
var anonymous =
new
{
Name = "Benjamin",
LastName = "Button"
};
var list = new List<anonymous>() {anonymous};

כמובן, הקוד הזה לא מתקמפל (ראו גם טיפים קודמים, למשל 150, 231)

אם בכל זאת חפצה נפשנו בלעשות דבר כזה, אפשר בשיטה הבאה:

ניצור פונקציה גנרית שמקבלת את האיבר כפרמטר:

1
2
3
4
private static List<T> CreateList<T>(T item)
{
return new List<T>();
}

ונקרא לה עם האיבר:

1
2
3
4
5
6
7
8
var anonymous =
new
{
Name = "Benjamin",
LastName = "Button"
};
var list = CreateList(anonymous);

כעת נוכל לעשות כאוות נפשנו עם הרשימה:

1
list.Add(anonymous); // Adding anonymous twice

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

(ראו גם טיפ מספר 28)

אפשר גם ליצור Extension Methods מתאימים, והדבר הזה יעבוד.

(ראו גם טיפים על Extension Methods, למשל 66-75)

המשך יום אנונימי טוב.

שתף