Я бы назвал это плохой практикой, да. Если вы хотите использовать анонимный тип в нескольких местах в коде, тогда важно сделать его номинальным. Помните, что динамический снова запускает компилятор , что представляет собой серьезную потерю производительности, и это меняет удобство для разработчика в обмен на скрытие ошибок, обнаруженных пользователем , что является серьезным стоимость отношений с клиентами.
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;
}
Подлый, а? Трюк приведения в качестве примера использует вывод обобщенного типа, чтобы сказать: «Я думаю, что этот объект здесь имеет ту же структуру анонимного типа, что и этот здесь».
Обратите внимание, что приведение примера работает только в той же сборке . Вы не можете привести пример анонимного типа, созданного в одной сборке, в анонимный тип, созданный в другой.