2013-07-09 2 views
0

У меня есть класс, где одно из свойств возвращает List<object>. Внутри этого списка я помещаю набор анонимных объектов.Неразумно ли использовать анонимный объект + динамический?

После этого у меня есть цикл, использующий этот объект как динамическую переменную.
Так что мой код выглядит следующим образом:

private List<object> BookerTypes 
{ 
    get 
    { 
     if (this.bookerTypes == null) 
     { 
      this.bookerTypes = new List<object>(); 

      var com = new SqlConnection(functions.ConnectionString).CreateCommand(); 
      com.CommandText = @" 
SELECT 
    BT.id 
    , BT.name 
FROM dbo.BookerTypes AS BT 
ORDER BY BT.name ASC 
"; 
      com.Connection.Open(); 
      try 
      { 
       using (var dr = com.ExecuteReader()) 
       { 
        while (dr.Read()) 
        { 
         this.bookerTypes.Add(new { id = dr.GetInt32(0), name = dr.GetString(1) }); 
        } 
       } 
      } 
      finally 
      { 
       com.Connection.Close(); 
      } 
     } 

     return this.bookerTypes; 
    } 
} 

[...]

this.cblSBT.Items.Clear(); 
    foreach(dynamic bt in this.BookerTypes) 
    { 
     this.cblSBT.Items.Add(new ListItem() 
     { 
      Value = bt.id.ToString() 
      , Text = bt.name 
      , Selected = this.competition.SubscriptionTypes.Contains((int)bt.id) 
     }); 
    } 

Помимо очевидного потерянное сильно типизированных типа, есть ли причина, почему я не должен этого делать?

+0

Считываемость, может быть? –

+0

Представьте, что вы наследуете свой код от другого разработчика, вам нужно будет выполнить поиск, чтобы выяснить, что такое тип – Sayse

ответ

3

Основная причина не в том, что, как вы сказали, вы потеряли статическую типизацию. Существуют также затраты на производительность, связанные с этим, но они менее важны, чем проблема, которую этот код имеет с точки зрения удобочитаемости и ремонтопригодности.

Если окажется, что вы ошибаетесь или ошибочно используете имя переменной, вы не можете проверять время компиляции (и это проще сделать без поддержки завершения кода). У вас также нет эффективных средств знать, во время компиляции, какие переменные могут существовать в List<object>, которые вам даны. Становится нетривиальной задачей отслеживать источник этого списка, чтобы выяснить, какие переменные могут там использоваться.

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

+0

. Я бы не сказал, что читаемость является проблемой. – James

+0

@James Тогда не стесняйтесь публиковать еще один ответ, указывающий, что, если что-либо, вы чувствуете * * * проблему с данным кодом. – Servy

+0

Я писал ответ, но вы в значительной степени рассмотрели мои проблемы: потеря безопасности типа и щепотка использования «динамического» вообще (просто орфографические ошибки и т. Д.). Просто добавив, что IMO, я не думаю, что читаемость теряется, так как свойства и т. Д. Понятны. – James

1

В верхней части типа безопасности потери & Другие проблемы, о которых уже было указано, я чувствую, что использование dynamic здесь просто неправильно.

Общий прецедент для dynamic предназначен для использования данных из внешних источников, например. API/COM и т. Д., В основном сценарии, где тип информации еще не определен. В вашем сценарии у вас есть контроль над данными, которые вы запрашиваете, и вы знаете, что типа данных, чтобы ожидать поэтому я не могу на самом деле оправдать, почему вы хотели бы использовать его над преимуществами, полученными при наличии четко определенного типа безопасная модель.

Неразумно ли использовать анонимный объект + динамический?

В вашем случае я бы сказал, что да.

+0

Анонимный тип fum! : D (легко написать) – Serge

+0

Это зависит.Когда вы «генерируете» некоторые действительно конкретные части данных всего на несколько строк выше кода, который вы используете, вы на самом деле получаете время (иначе мы никогда не будем использовать анонимные классы). В этом случае для нескольких строк существует немного больше, поэтому на этот раз я не буду использовать динамический + аноним. – Serge

+0

@Serge да, я согласен с тем, что он полезен для временного хранения, когда безопасность типа не важна. – James

Смежные вопросы