English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В C# анонимный тип - это тип (класс) без имени, имя которого может содержать только общие только для чтения свойства. Он не может содержать других членов, таких как поля, методы, события и т.д.
Создание анонимного типа с помощью оператора new с объектным инициализатором. Импlicitный тип переменной var используется для сохранения ссылки на анонимный тип.
Ниже приведен пример создания переменной анонимного типа student, содержащей три свойства Id, FirstName и LastName.
var student = new { Id = 1, FirstName = "James", LastName = "Bond" };
Свойства анонимного типа являются только чтением, не могут быть инициализированы null, анонимными функциями или типами указателей. Эти свойства можно доступить с помощью точечной (.) нотации, как объектные свойства. Однако, значения свойств нельзя изменить, так как они только для чтения.
var student = new { Id = 1, FirstName = "James", LastName = "Bond" }; Console.WriteLine(student.Id); //вывод 1 Console.WriteLine(student.FirstName); //вывод: James Console.WriteLine(student.LastName); //вывод: Bond student.Id = 2;//ошибка: значение не может быть изменено student.FirstName = "Steve";//ошибка: значение не может быть изменено
Свойства анонимного типа могут включать другой анонимный тип.
var student = new { Id = 1, FirstName = "James", LastName = "Bond", Address = new { Id = 1, City = "London", Country = "UK" } };
Вы также можете создать массив анонимных типов.
var students = new[] { new { Id = 1, FirstName = "James", LastName = "Bond" }, new { Id = 2, FirstName = "Steve", LastName = "Jobs" }, new { Id = 3, FirstName = "Bill", LastName = "Gates" } };
Анонимные типы всегда локальны для метода, который их определяет. Их нельзя возвращать из метода. Однако, анонимные типы можно передавать в качестве параметра типа объекта методу, но это не рекомендуется. Если нужно передать их другому методу, используйте struct или class, а не анонимный тип.
Обычно, для создания анонимного типа с помощью подзапроса LINQ используется оператор Select, чтобы из каждого объекта集合 возвращать подмножество свойств.
class Program { static void Main(string[] args) { IList<Student> studentList = new List<Student>() { new Student() { StudentID = 1, StudentName = "John", age = 18 } new Student() { StudentID = 2, StudentName = "Steve", age = 21 }, new Student() { StudentID = 3, StudentName = "Bill", age = 18 }, new Student() { StudentID = 4, StudentName = "Ram", age = 20 }, new Student() { StudentID = 5, StudentName = "Ron", age = 21 } }; var students = from s in studentList select new { Id = s.StudentID, Name = s.StudentName }; foreach(var stud in students) Console.WriteLine(stud.Id + "-" + stud.Name); {} {} public class Student { public int StudentID { get; set; } public string StudentName { get; set; } public int age { get; set; } {}
1-John 2-Steve 3-Bill 4-Ram 5-Ron
В данном примере подзапрос select в LINQ выбирает свойства StudentID и StudentName и renamed их как Id и Name. Это очень полезно для экономии памяти и избежания избыточного кода. Результаты запроса содержат только свойства StudentID и StudentName, как показано в следующем окне отладки.
Visual Studio поддерживает IntelliSense для анонимных типов, как показано ниже.
Внутри все анонимные типы напрямую наследуются от класса System.Object. Компилятор генерирует класс с автоматически сгенерированными именами и применяет соответствующие типы к каждому свойству в зависимости от значения выражения. Хотя ваш код не может получить к нему доступ. С помощью метода GetType() можно увидеть имя.
static void Main(string[] args) { var student = new { Id = 1, FirstName = "James", LastName = "Bond" }; Console.WriteLine(student.GetType().ToString()); {}