Общая итерация по списку - PullRequest
0 голосов
/ 26 июня 2019

Я строю функцию генератора электронной почты.Она начиналась как функция регулярного выражения, но быстро перешла к рефлексии, чтобы сделать ее как можно более общей.Идея состоит в том, чтобы функция генератора электронной почты извлекала информацию из класса сообщений.Все начиналось как простая задача, так как функция должна была изменить только несколько статических элементов, но поскольку функция становилась все более сложной, а отправляемые шаблоны нуждались в таблицах информации, то созданной мной функции было недостаточно.

Я расширил функцию, чтобы использовать цикл foreach для запуска по шаблону и замены текста на основе списка из класса messageData.Я пытался получить список, созданный в messageData, чтобы реализовать его в функции emailGenerator.Я получил:

string value = match.Groups["value"].Value;
// Code removed to shorten length
var items = (IEnumerable) value;

Но он не собирает информацию из класса messageData.Я думаю, что, возможно, мне нужно получить значение в список?

Вот функция EmailGenerator:

    public class EmailGenerator : IEmailGenerator
    {
        private string mergeTemplate(string template, object obj)
        {
            var operationMatches = operationParser.Matches(template).Cast<Match>().Reverse().ToList();
            foreach (var match in operationMatches)
            {
                string operation = match.Groups["operation"].Value;
                string value = match.Groups["value"].Value;
                var propertyInfo = obj.GetType().GetProperty(value);

                object dataValue = propertyInfo.GetValue(obj, null);

                if (operation == "endforeach")
                {
                    string foreachToken = "$foreach " + value + "$";
                    var startIndex = template.LastIndexOf(foreachToken, match.Index);
                    var templateBlock = template.Substring(startIndex + foreachToken.Length, match.Index - startIndex - foreachToken.Length);
                    var items = (IEnumerable) value;

                    string blockResult = "";

                    foreach (object item in items)
                    {
                        blockResult += this.mergeTemplate(templateBlock, item);
                    }

                    template = template.Remove(startIndex, match.Index - startIndex).Insert(startIndex, blockResult);
                }
            }
    }

А вот класс messageData.Он получает информацию от DTO.** РЕДАКТИРОВАТЬ: Удален ненужный код.

public class messageData : IMailObject
    {
        public List<messageItemData> Items
        {
            get
            {
                var items = new List<messageItemData>();
                foreach (var docDTO in this.recipientDTO.InfoList)
                {
                    items.Add(new messageItemData(docDTO));

                }
            }
        }
    }

    public class messageItemData
    {
        // Properties
    }

Я пытаюсь сделать так, чтобы функция emailGenerator была достаточно универсальной, чтобы ее можно было повторно использовать для других шаблонов электронной почты в дальнейшем, собирая информацию о замене изкласс messageData и список, который он содержит.

1 Ответ

0 голосов
/ 28 июня 2019

Итак, я наконец-то нашел ответ.Код работал на 99%.Это было так же просто, как изменить var items = (IEnumerable) value; на var items = (IEnumerable) dataValue;

...