Использование динамических типов для получения значений от анонимных объектов - плохая практика? - PullRequest
2 голосов
/ 27 марта 2011

Примечание: мой вопрос не о ASP.Net.

У меня есть GridView, связанный с анонимной коллекцией с использованием LINQ.

Я хочу, чтобы в обработчике событий в сетке было получено значениеиз связанного объекта, который не может быть приведен к какому-либо статическому типу, потому что его тип является анонимным.

Чтобы решить эту проблему, я использовал динамический тип, чтобы получить значение

protected void MyGridView_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        dynamic dataItem = e.Row.DataItem; // getting the bound object

        bool isCurrentEntity = dataItem.IsCurrentEntity;
        if (isCurrentEntity)
            e.Row.Style.Add(HtmlTextWriterStyle.FontWeight, "Bold");
    }
}

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

1 Ответ

17 голосов
/ 27 марта 2011

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

Dynamic был разработан, чтобы сделать код, который был уже , медленным и хрупким, более приятным для чтения. Если вы уже собираетесь использовать рефлексию или уже будете разговаривать с устаревшим объектом автоматизации COM, то вы уже окажетесь в мире медленного, опасного кода. Это также может быть легко читаемый медленный опасный код. Если вы можете избежать того, чтобы быть в этом мире, сделайте это; используйте номинальный тип.

В качестве альтернативы, если вы хотите использовать анонимный тип и иметь статическую типизацию, используйте трюк «cast by example»:

object anon;
void M1()
{
    anon = new { X = 123, Y = 456 };
}
void M2()
{ 
    // we want to get anon.X, but it is anonymous. How do we
    // trick the compiler into it?

    var cast = CastByExample(new { X = 0, Y = 0 }, anon);
    int x = cast.X;  // gets anon.X!
}

static T CastByExample<T>(T example, object ob) where T : class
{
    return (T)ob;
}

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

Обратите внимание, что приведение примера работает только в той же сборке . Вы не можете привести пример анонимного типа, созданного в одной сборке, в анонимный тип, созданный в другой.

...