2014-11-20 6 views
0

У меня есть следующий кодПолучение анонимного объекта в C#

using System; 
using System.Collections.Generic; 

public class Test 
{ 
    public static void Main() 
    { 
     List<object> list = new List<object>(); 
     list.Add(new { 
      Value = 0 
     }); 
     //Console.WriteLine(list[0].Value); 
    } 
} 

Есть простой способ, чтобы написать комментируемой строку кода, не вызывая при компиляции ошибки времени? Я знаю, что могу прибегнуть к использованию динамического ключевого слова или реализации метода расширения для класса Object, который использует Reflection, но может быть еще один более приемлемый способ?

Цель состоит в том, чтобы избежать создания класса, поскольку его единственной целью было бы хранить данные. Но в то же время все еще можно получить данные позже в программе. Этот код в конечном итоге окажется в веб-методе, поэтому я хочу, чтобы он был динамическим/анонимным в первую очередь. Все объекты будут иметь одинаковые свойства, так как они будут хранить значения, хранящиеся в таблицах, но значения необходимы позже для других вычислений.

+0

Почему использовать '' List и анонимный объект в первую очередь? Наверняка у вас есть представление о том, какие предметы вы собираетесь хранить в списке? – mason

+0

Я боюсь, что ключевое слово 'dynamic' является единственным полезным решением. – Erwin

+0

Только два способа сделать это - использовать динамику или отражение. –

ответ

3

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

Не так, как вы объявили список. Если список будет содержать только объекты этого анонимного типа, вы можете использовать инициализатор массива и преобразовать его к List<{anonymous type}>:

var list = (new [] { 
     new { Value = 0 } 
    }).ToList(); 
Console.WriteLine(list[0].Value); 

Хорошая вещь, что вы можете добавить в список легко, так как анонимные типы с теми же свойствами, объединяются в один тип компилятором:

list.Add(new {Value = 1}); 

комментарий Per Servy, в метод, чтобы избежать создания массива будет просто:

public static List<T> CreateList<T>(params T[] items) 
{ 
    return new List<T>(items); 
} 

использование:

var list = CreateList(new { Value = 0 }); 
+0

Я пытался придумать способ сделать это через инициализатор, я не думаю о массиве, а затем 'ToList()' метод. –

+0

Вы можете написать свой собственный общий метод, чтобы избежать создания массива. – Servy

+0

@servy Я бы хотел увидеть пример метода, который может сгенерировать этот массив и как вы его назовёте –

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