Я играл с API Team Foundation Server 2018. Я могу подключиться к API и получить список рабочих элементов в форме List<IDictionary<string, object>>
, но этот формат не очень удобен. Данные нужно немного помассировать, чтобы они были более удобными для использования и дружественными к циклам.
Например, я хочу взять этот формат данных и отобразить его в сетке данных. Я создал простое приложение WPF без каких-либо наворотов для решения этой проблемы.
В этом примере есть переменная с именем data
, которая была создана так, чтобы напоминать данные из моей системы TFS.
На MainWindow.xaml
все, что я создал, это DataGrid с именем DataGrid
. В MainWindow.xaml.cs
я намереваюсь сопоставить List<WorkItem>
с этой DataGrid.
MainWindow.xaml
<Window x:Class="AutoMapperExample.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" Title="AutoMapper Example" Height="350" Width="525" ResizeMode="CanResizeWithGrip">
<Grid>
<DataGrid x:Name="DataGrid" />
</Grid>
</Window>
MainWindow.xaml.cs
namespace AutoMapperExample.Views {
using System.Collections.Generic;
using System.Windows;
using AutoMapper;
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
var data = new List<IDictionary<string, object>> {
new Dictionary<string, object> {
{"System.Id", 1}, {"System.State", "Open"}, {"System.TeamProject", "Project1"}, {"System.Title", "First Work Item Title for Project 1"}
},
new Dictionary<string, object> {
{"System.Id", 2}, {"System.State", "Closed"}, {"System.TeamProject", "Project2"}, {"System.Title", "Work Item Title for Project 2"}
},
new Dictionary<string, object> {
{"System.Id", 3}, {"System.State", "Closed"}, {"System.TeamProject", "Project1"}, {"System.Title", "Second Work Item Title for Project 1"}
}
};
DataGrid.ItemsSource = ParseData(data);
}
private IEnumerable<WorkItem> ParseData(List<IDictionary<string, object>> data) {
Mapper.Initialize(cfg => {
// cfg.CreateMap<List<IDictionary<string,object>>, List<WorkItem>>();
// cfg.CreateMap<IDictionary<string, object>, WorkItem>();
// cfg.RecognizePrefixes("System.");
// cfg.ReplaceMemberName("System.", string.Empty);
});
var workItems = Mapper.Map<List<WorkItem>>(data);
return workItems;
}
}
public class WorkItem {
public int Id { get; set; }
public string Project { get; set; }
public string State { get; set; }
public string Title { get; set; }
}
}
Обратите внимание, что ключи всех словарей также имеют префикс System.
.
Я решил использовать AutoMapper для решения этой проблемы, и полученный список содержит правильное количество элементов, но все свойства имеют значения по умолчанию или нулевые. В примере есть прокомментированный код, который показывает, что я пробовал, но все они имеют одинаковый результат.
Является ли AutoMapper решением этой проблемы? Если да, то какие настройки мне нужно правильно преобразовать в мой List<WorkItem>