ASP.NET MVC 2.0 & .NET 4.0 – Tuple
Jag tog tidigare upp ett exempel som visar hur man kan använda dynamic och det nya objektet ExpandoObject för att skicka dynamiska variabler från controllern till vyn (http://weblogs.asp.net/mikaelsoderstrom/archive/2010/01/08/asp-net-mvc-2-0-amp-net-4-0-expandoobject.aspx). En nackdel med det kan vara att man t.ex. inte får någon intellisense, vilket man annars får när man använder statiska objekt.
För att lösa det så kan vi (förutom att skapa nya typer anpassade för den specifika vyn) använda Tuple, vilket även det är en nyhet i .NET 4.0. Tuple är ett objekt som kan innehålla flera hårt typade parametrar, vilket gör att det kan användas på väldigt många olika sätt.
Det vi ska göra här är att skapa upp en ny ActionResult-metod vid namn ”TupleView”. Den skall returnera exakt samma data som i det tidigare exemplet, men nu med ett statiskt objekt, vilket gör det hårt typat. Vi kommer ej heller i det här exemplet att skapa upp någon ny typ, utan kommer att förlita oss helt på vad Tuple har att erbjuda.
Det vi ska ha är en lista med customer-objekt. Varje customer-objekt ska ha en Name-property, en Age-property samt en Func<int, string> som skriver ut åldern på ett språk som är unikt för det enskilda objektet.
Då Tuple är ett generiskt objekt med möjlighet att ha en eller flera typer så ska vi skapa upp ett sådant för varje person, av typen ”string, int, Func<int, string>”. Vi lagrar dessa i en lista och returnerar till vyn.
public ActionResult TupleView()
{
var customers = new List<Tuple<string, int, Func<int, string>>>();
var Mikael = new Tuple<string, int, Func<int, string>>(
"Mikael",
24,
new Func<int, string>(a => a.ToString() + "år gammal")
);
customers.Add(Mikael);
var Bill = new Tuple<string, int, Func<int, string>>(
"Bill",
54,
new Func<int, string>(a => a.ToString() + "years old")
);
customers.Add(Bill);
return View(customers);
}
Vi har inga namngivna properties här som med ExpandoObject, men det vi får istället är statiskt typade objekt (även om vi kan välja att ha med dynamiska objekt i vår tuple).
När vi skriver ut dem i vyn så kan vi inte använda namnen på egenskaperna då de inte existerar, utan istället så får vi använda egenskaper som ”Item1”, ”Item2” osv. Item1 är det första värdet i Tuple-objektet, alltså namnet i det här fallet.
När vi skriver ut det i vyn så bör det se ut så här för att vi ska få samma resultat som i ExpandoObject-exemplet:
<h2>TupleView</h2>
<ul>
<% foreach (var item in Model) { %>
<li><%= item.Item1 %>, <%= item.Item3(item.Item2) %></li>
<% } %>
</ul>
Det går alltså även här att använda Func<T> utan problem, vilket gör att det är möjligt att skicka med metoder i ett Tuple-objekt.