2015-04-13 2 views
1

Я хочу создать общее решение DataTable на стороне сервера в приложении ASP.NET MVC. То, что у меня есть на каждом изображении Index, было бы JQuery datatable с вызовом AJAX контроллеру для получения результата постраничных данных. Операции, выполняемые в следующем:Создание динамического объекта с неизвестными типами свойств

public JsonResult GetNewRequests([ModelBinder(typeof(DataTablesModelBinder))] DataTablesPageRequest pageRequest) 
{ 
    var page = RequestsQuery(pageRequest); // Retrieves page of result from db and does any filtering + sorting 
    var pageResponse = DataTablesFormat.PageResponse(pageRequest, page); // Formats response for jQuery DataTable to use 
    return Json(pageResponse, JsonRequestBehavior.AllowGet); // Returns result 
} 

Ответ вернулся в DataTable управления JQuery в следующем формате:

return new 
{ 
    sEcho = pageRequest.Echo, 
    iTotalRecords = report.TotalItems, 
    iTotalDisplayRecords = report.TotalItems, 
    sColumns = pageRequest.ColumnNames, 
    aaData = results 
}; 

Часть я работаю разрабатывает перечень типовых элементов для вернуться именно:

aaData = results 

results должен быть список любой модели объекта, включая все ее соответствующие свойства. Я пытался использовать reflection вместе с ExpandoObject, чтобы завершить это решение, но не могу понять механику:

public static object PageResponse(DataTablesPageRequest pageRequest, Page<object> report) 
{ 
    List<object> results = new List<object>(); 

    foreach(var item in report.Items) 
    { 
     dynamic dynamicObject = new ExpandoObject(); 
     Type type = item.GetType(); 
     PropertyInfo[] properties = type.GetProperties(); 

     foreach(PropertyInfo property in properties) 
     { 
      Type propertyType = property.PropertyType; 
      // Here is where I want to add a property with the correct name of the required type to the dynamic object 
      dynamicObject[property.Name] = property.GetValue(item, null) as propertyType; 
     } 

     results.Add(dynamicObject); 
    } 

    return new 
    { 
     sEcho = pageRequest.Echo, 
     iTotalRecords = report.TotalItems, 
     iTotalDisplayRecords = report.TotalItems, 
     sColumns = pageRequest.ColumnNames, 
     aaData = results 
    }; 
} 

Я понял кое-что даже во время набора текста это. Часть я не могу понять:

dynamicObject[property.Name] = property.GetValue(item, null) as propertyType; 

То есть, устанавливая тип недвижимости, например: DateTime.

Повторяю. Я хочу построить список элементов модели. Это может быть любой тип модели с любым количеством свойств, каждый из которых может быть любого типа (int, string, bool, DateTime и т. Д.)

+0

вы можете использовать 'Convert.ChangeType' вопрос в том, почему вы хотите сделать, что вы уже используете' dynamic', вы пытаетесь он прошел вместо интерфейса или что? – Luaan

+0

Я отредактировал yo ур. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

1

Вы должны отдать свой EXPANDO Ань IDictionary<string, object> если вы хотите, чтобы иметь возможность добавлять свойства динамически:.?

foreach(var item in report.Items) 
{ 
    dynamic dynamicObject = new ExpandoObject(); 
    var dic = dynamicObject as IDictionary<string, object>; 
    var properties = item.GetType().GetProperties(); 

    foreach(PropertyInfo property in properties) 
    { 
     dic[property.Name] = property.GetValue(item, null); 
    } 

    // At this stage the dynamicObject will contain properties with correct 
    // names and types 

    results.Add(dynamicObject); 
} 
+0

Кажется, что объект возвращается в следующем формате: '[ {« Ключ »:« LogId »,« Value »: 1509}, {« Key »:« LogDate »,« Value »:« \ Date (1428904824960) \/"}, \t {" Key ":" LogLevel», "Значение": "Информация"}, \t { "Key": "LogSource", "Значение": "EmailNotification"}, \t { "Ключ": "LogText", "Значение": "Уведомление Процесс остановлено"} ] ' как соединенный с форматом: ' [ LOGID: 1509, LogDate: "\/Дата (1428904824960) \/", \t LogLevel:" Информация ", \t LogSource: «EmailNotification», \t LogText: «Процесс уведомления остановлен» ] ' – Carel

+0

Это правильно. Вот как словарь сериализуется в JSON. –

1

Поскольку Luaan уже прокомментировал, Convert.ChangeType - ответ на ваш вопрос.

Однако использование этого не поможет вам в любой момент. Зачем? Поскольку приведение значения объекта будет полезно, только если вы хотите присвоить его переменной определенного типа (против object).

Основной тип property.GetValue(item, null) никогда не изменится, поэтому попытка бросить его не поможет.

Кроме того, почему бы не просто использовать List<Dictionary<string, object>> или даже List<object[]> (который я часто использую для целей передачи данных. Там нет смысла в использовании dynamic или ExpandoObject здесь.