Помимо запросов LINQ, как вы используете анонимные типы в C #?

StackOverflow https://stackoverflow.com/questions/168150

  •  03-07-2019
  •  | 
  •  

Вопрос

Я пытался освоить некоторые из новых функций в C #, и одна из них, которые мне не приходилось использовать, - это анонимные типы.

Я понимаю использование, поскольку оно относится к запросам LINQ, и я посмотрел на это ТАК сообщение , в котором задан похожий вопрос. Большинство примеров, которые я видел в сети, связаны с запросами LINQ, что круто. Я также видел несколько надуманных примеров, но не совсем то, где я видел большую ценность.

У вас есть новое использование анонимных типов, когда вы думаете, что оно действительно предоставляет вам некоторую полезность?

Это было полезно?

Решение

Немного подумав, вы можете превратить анонимный тип в словарь < string, object > ;; Рой Ошеров пишет здесь о своей технике: http://weblogs.asp.net/rosherove/archive/2008/03/11/turn-anonymous-types-into-idictionary-of-values.aspx

Джейкоб Карпентер использует анонимные типы как способ инициализации неизменяемых объектов с синтаксисом, подобным инициализации объекта: http://jacobcarpenter.wordpress.com/2007/11/19/named-parameters-part-2/

Анонимные типы можно использовать для предоставления более простых для чтения псевдонимов свойств объектов в коллекции, перебираемой с помощью оператора foreach. (Хотя, если честно, это на самом деле не более чем стандартное использование анонимных типов с LINQ to Objects .) Например:

Dictionary<int, string> employees = new Dictionary<int, string>
{
    { 1, "Bob" },
    { 2, "Alice" },
    { 3, "Fred" },
};

// standard iteration
foreach (var pair in employees)
    Console.WriteLine("ID: {0}, Name: {1}", pair.Key, pair.Value);

// alias Key/Value as ID/Name
foreach (var emp in employees.Select(p => new { ID = p.Key, Name = p.Value }))
    Console.WriteLine("ID: {0}, Name: {1}", emp.ID, emp.Name);

Несмотря на то, что в этом коротком примере не было особых улучшений, если бы цикл ID был длиннее, то ссылки на Name и <=> могут улучшить читаемость.

Другие советы

ASP.NET MVC использует эти объекты повсюду.

Иногда я подозреваю, что может быть полезно выполнить что-то, что похоже на запрос LINQ, но случайно не использует LINQ - но вам все еще нужна проекция какого-то рода. Не думаю, что я использовал бы анонимные типы в их текущей форме для чего-то радикально отличного от проекций LINQ.

Одна вещь, которую я хотела бы увидеть, - это возможность создавать " named " типы с простыми объявлениями, которые будут генерировать свойства и конструктор таким же образом, как для анонимных типов, а также переопределять Equals / GetHashCode / ToString таким же (полезным) способом. Затем эти типы можно преобразовать в & Quot; normal & Quot; типы, когда возникла необходимость добавить больше поведения.

Опять же, я не думаю, что использовал бы это ужасно часто - но время от времени эта способность была бы полезной, особенно в рамках нескольких методов класса. Возможно, это могло бы стать частью больших усилий по обеспечению большей поддержки неизменяемых типов в C # 5.

В дополнение к тому, что сказал Джастис, ASP.Net MVC - первое место, где я увидел, что они используются интересным и полезным способом. Вот один пример:


Html.ActionLink("A Link", "Resolve", new { onclick = "someJavascriptFn();" })

ASP.Net MVC использует анонимные типы, подобные этому, для добавления произвольных атрибутов к элементам HTML. Я предполагаю, что есть несколько разных способов достижения одной и той же цели, но мне нравится лаконичный стиль анонимных типов, он придает вещам больше динамического ощущения языка.

Наибольшее использование для анонимных типов - LINQ, именно поэтому он был создан.

Я предполагаю, что одной из причин анонимного типа вне linq является создание временного объекта, похожего на структуру, например:

var x = new { a = 1, b = 2 };

Это может сделать вашу жизнь немного проще в некоторых ситуациях.

Я использовал их для создания шаблонных писем, так как они хороши, если вы используете рефлексию и непатентованные формы.

Некоторую информацию можно найти здесь: http: //www.aaron- powell.com/blog.aspx?id=1247

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top