Помимо запросов LINQ, как вы используете анонимные типы в C #? - PullRequest
5 голосов
/ 03 октября 2008

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

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

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

Ответы [ 6 ]

6 голосов
/ 06 октября 2008

Немного подумав, вы можете превратить анонимный тип в словарь ; Рой Ошеров пишет свою технику для этого здесь: 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);

Хотя в этом коротком образце нет особых улучшений, если бы цикл foreach был длиннее, обращение к ID и Name могло бы улучшить читабельность.

5 голосов
/ 03 октября 2008

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

3 голосов
/ 06 октября 2008

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


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

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

3 голосов
/ 03 октября 2008

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

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

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

2 голосов
/ 03 октября 2008

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

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

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

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

1 голос
/ 06 октября 2008

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

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

...