2016-01-15 3 views
1

Предположим, что мы имеем функцию:анонимный тип объекта или динамический

public IEnumerable<object> GetViewModel(int id) { 
      var records = LoadRecordById(id);  
      var result = (from record in records 
       select new { 
        field1 = record.data1, 
        field2 = record.data2, 
        .... 
       }).ToArray();  
      return result; 
     } 

Мы можем вернуть его как IEnumerable<object> и как IEnumerable<dynamic>. Вопрос в том, что использовать и почему? какие преимущества/недостатки?

+1

Duplicate? http://stackoverflow.com/questions/21080346/difference-between-object-dynamic-and-var –

+2

Посмотрите различия между 'object' и' dynamic', и у вас есть свой ответ. Рассмотрите возможность создания именованного типа - анонимные типы не предназначены для использования таким образом. –

+1

IMHO создает интерфейс или базовый класс; это нарушает основные принципы ОО. – daryal

ответ

3

У вас сейчас анонимный вид.

Если вы отбросили его до object, у вас не будет возможности получить поля. Вы не можете отбросить его обратно на анонимный объект (так как вы не знаете, что это было), и вы не можете получить доступ к свойствам с object.

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

Лучше всего создать класс, который обладает необходимыми свойствами, и вернуть список этого класса. Затем вы получите свойства и получите преимущества статического ввода.

1

Вы должны использовать интерфейс или базовый класс. Но для ответа на ваш вопрос:

dynamic foo = "Some string"; 
foo.ToUpper(); // this works fine 
foo.Something(); // compiles, but runtime error 

object bar = "Some string"; 
bar.ToUpper(); // does not compile 
Смежные вопросы