Главная страница   /   4.7. Использование анонимных типов (ASP.NET MVC 4

ASP.NET MVC 4

ASP.NET MVC 4

Адам Фриман

4.7. Использование анонимных типов

Объединив инициализаторы объектов и автоматическое определение типа, мы можем создавать простые объекты для хранения данных без необходимости указания соответствующего класса или структуры. В листинге 4-25 представлен пример.

Листинг 4-25: Создание анонимного типа
...
var myAnonType = new {
	Name = "MVC",
	Category = "Pattern"
};
...

В этом примере myAnonType – это анонимно типизированный объект. Это не обозначает, что он является динамическим, как например, JavaScript переменные, которые являются динамически типизированными (слабо типизированными). Это просто обозначает, что тип будет автоматически определен компилятором. Строгая типизация по-прежнему соблюдается. Например, вы можете получать и устанавливать только те свойства, которые были определены в инициализаторе.

C# компилятор генерирует класс, основываясь на имени и типе параметров в инициализаторе. Два анонимно типизированных объекта, которые имеют одинаковые имена свойств и типы, будут относиться к одному и тому же автоматически созданному классу. Это обозначает, что мы можем создать массивы анонимно типизированных объектов, как показано в листинге 4-26. Здесь представлен метод действия CreateAnonArray, который мы добавили в контроллер Home.

Листинг 4-26: Создание массива анонимно типизированных объектов
using LanguageFeatures.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Mvc;
namespace LanguageFeatures.Controllers
{
	public class HomeController : Controller
	{
		public string Index()
		{
			return "Navigate to a URL to show an example";
		}
		// ...другие методы действия опущены для краткости ...
		public ViewResult CreateAnonArray()
		{
			var oddsAndEnds = new[] {
				new { Name = "MVC", Category = "Pattern"},
				new { Name = "Hat", Category = "Clothing"},
				new { Name = "Apple", Category = "Fruit"}
				};
			StringBuilder result = new StringBuilder();
			foreach (var item in oddsAndEnds)
			{
				result.Append(item.Name).Append(" ");
			}
			return View("Result", (object)result.ToString());
		}
	}
}

Обратите внимание, что при объявлении массива мы используем var. Мы должны это сделать, потому что у нас нет типа, который мы могли бы указать, как в типизированном массиве. И хотя мы не определили класс ни для одного из этих объектов, мы все еще можем перечислить содержимое массива и прочитать значение свойства Name каждого из них. Это важно, потому что без этой возможностимы вообще не смогли бы создавать массивы анонимно типизированных объектов. Или, вернее, мы могли бы создавать такие массивы, но мы не могли бы ничего полезного с ними делать. Если вы запустите этот пример и будете работать с данным методом действия, вы увидите следующий результат:

MVC Hat Apple