У меня есть следующий вложенный класс ввода
//InputClass
public class MessageViewModel
{
public bool IsSelected { get; set; }
public string Subject { get; set; }
public DateTime CreationDate { get; set; }
public List<MessageViewModel> Messages { get; set; }
}
, и я хочу создать новый экземпляр следующего типа:
//Target Class
public class DestinationClass
{
public string Subject { get; set; }
}
для каждого экземпляра MessageViewModel, который имеет свойство IsSelected= true Какое решение является лучшим в этом случае?Может ли это быть достигнуто с помощью AutoMapper?
EDIT:
позволяет предположить, что у меня есть следующий объект:
var vm = new MessageViewModel
{
Messages = new List<MessageViewModel> {
new MessageViewModel {
IsSelected = true,
Messages = new List<MessageViewModel> {
new MessageViewModel { IsSelected = true,
Messages = new List<MessageViewModel> { new MessageViewModel { },
new MessageViewModel { },
new MessageViewModel { } } } } } }
};
Я хотел бы пройти его и извлекать и отображать толькоMessageViewModels, для которого IsSelected равно true.
решено:
с использованием следующего кода:
public static class TraversalHelper
{
public static void TraverseAndExecute<T>(this T composite, Func<T, IEnumerable<T>> selectChildren, Action<T> action)
where T : class
{
action.Invoke(composite);
composite.TraverseAndExecute(selectChildren, action, new List<T> { composite });
}
private static void TraverseAndExecute<T>(this T composite, Func<T, IEnumerable<T>> selectChildren, Action<T> action, IList<T> invokedComponents)
where T : class
{
invokedComponents = invokedComponents ?? new List<T>();
var components = selectChildren(composite) ?? new T[] { };
foreach (var component in components)
{
if (!invokedComponents.Contains(component))
{
action.Invoke(component);
invokedComponents.Add(component);
component.TraverseAndExecute(selectChildren, action, invokedComponents);
}
else
{
}
}
}
}
Мне удалось выполнить итерацию по моему иерархическому объекту:
var vm = new MessageViewModel
{
Messages = new List<MessageViewModel> {
new MessageViewModel {
IsSelected = true,
Messages = new List<MessageViewModel> {
new MessageViewModel {
IsSelected = true,
Messages = new List<MessageViewModel> {
new MessageViewModel { },
new MessageViewModel { },
new MessageViewModel { } } } } } }
};
var results = new List<DestinationClass>();
vm.TraverseAndExecute(_ => _.Messages, _ => {
if(_.IsSelected == true)
{
results.Add(new DestinationClass { Subject = _.Subject });
}
});