Я наткнулся на этот вопрос, когда искал способ создать временный список временных объектов.
Почему я хочу создать такую вещь? Я искал быстрый способ вернуть JSON для списка объектов, сделанных из некоторых значений другого объекта. Вот что я имею в виду.
Предположим, у меня есть класс Employee на стороне сервера, который в C # выглядит следующим образом:
public class Employee
{
public int Id;
public int businessGroupId;
public string title;
public int positionId;
public string firstName;
public string lastName;
...
}
Кроме того, у меня есть коллекция этих объектов, которые я могу легко перебрать, что-то вроде следующего:
List<Employee> allEmployees = new List<Employee>();
Теперь я хочу вернуться на свою вызывающую веб-страницу всей коллекции сотрудников , но я хочу только firstName, lastName для каждого . Я хочу, чтобы они вернулись как JSON.
Вот важный момент
Я не хочу возвращать каждое свойство в объекте Employee.
Я знаю, что могу легко создать анонимный тип, просматривая коллекцию allEmployees и каждый раз создавая новый объект.
Это будет выглядеть примерно так:
foreach (Employee e in allEmployees)
{
var tempObj = new {F_Name=e.firstName, L_Name=e.lastName};
}
Какой тип анонимного типа? :)
Хитрость в том, что мне нужна целая коллекция (List <>) этих анонимных объектов.
Тем не менее, у меня нет способа предоставить List тип, который я буду использовать. Я не могу создать
List<unknown> allTempObjects = new List<unknown>();
Или я могу?
С динамическим, это возможно
Я могу сделать следующее, и это прекрасно работает:
List<dynamic> allEmployees = new List<dynamic>();
foreach (Employee e in allEmployees)
{
var tempObj = new {F_Name=e.firstName, L_Name=e.lastName};
allEmployees.Add(tempObj);
}
// use the JavaScript Serializer to serialize the dynamic collection
JavaScriptSerializer jss = new JavaScriptSerializer();
// write the result out to the HTTP Stream (HtmlTextWriter in overridden Render method)
writer.Write(jss.Serialize(allEmployees));
Вы увидите JSON на стороне клиента, который выглядит следующим образом:
[
{
F_Name: "Seth",
L_Name: "Godin"
},
{
F_Name: "Charles",
L_Name: "Petzold"
},
{
F_Name: "Jeff",
L_Name: "Prosise"
}
]
Наконец, вы можете спросить, почему я хочу это сделать. Ответ прост: я хочу новый тип, который используется только для сериализации и отправки моему клиенту. Отличная причина для анонимного типа и анонимного набора анонимных типов, не правда ли?