Не можете присвоить значение свойству объекта в цикле foreach? - PullRequest
1 голос
/ 15 октября 2010

У меня есть объект, определенный как

public class EmailData
    {
        public string TemplateId { get; set;}
        public IEnumerable<Recipient> To { get; set; }
        public IEnumerable<Recipient> CC { get; set; }
        public IEnumerable<Recipient> BCC { get; set; }
    }

public class Recipient
{
    public string Key { get; set; }
    public string Type { get; set; }
    public string Email { get; set; }
    public string Id { get; set; }
}

Я заполнил его в конструкторе, затем мне нужно закончить заполнение значений Recipient, и в двух словах, я собираюсь это (после различных попыток):

public EmailData EmailObject;

public void BuildEmailData()
{
   EmailDataBuilder builder = new EmailDataBuilder(EmailObject,CSGTemplateId);
   EmailObject = builder.BuildObject();
}

public void PopulateEmailAddresses()
{
   SetToValues();
}

private void SetToValues()
{
   foreach (Recipient t in EmailObject.To)
   {
       var _user = RepoUser.GetUserById(t.Key);
       t.Email = _user.Email;
       t.Id = _user.Id;
   }
}

Итак, вы видите, что у меня есть объект, и мне нужно заполнить еще пару полей.Теперь я получаю, что при взгляде foreach создается переменная, которую я использую, поэтому, когда я присваиваю значение Email, это не аргумент данных, а переменная.Но как мне обойти это?Я пропускаю что-то более простое с foreach?

Большое спасибо, это бомбардировало мои юнит-тесты, прежде чем я понял, что задания не работают.не то, чтобы использовать коллекцию получателей вместо IEnumerable напрямую:

public class EmailData
    {
        public string TemplateId { get; set;}
        public RecipientCollection To { get; set; }
        public RecipientCollection CC { get; set; }
        public RecipientCollection BCC { get; set; }
    }

 public class RecipientCollection: IEnumerable<Recipient>
    {
        private readonly List<Recipient> variableList = new List<Recipient>();

        public IEnumerator<Recipient> GetEnumerator()
        {
            return variableList.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        public void Add(Recipient v)
        {
            variableList.Add(v);
        }
    }

 public EmailData BuildObject()
        {
            // get the template.
            EmailObj.TemplateId = _templateRepo.GetCSGEmailTemplate(CSGTemplateId).TemplateId;

            // populate the people
            RecipientCollection _toCollection = new RecipientCollection();
            RecipientCollection _ccCollection = new RecipientCollection();
            RecipientCollection _bccCollection = new RecipientCollection();

            foreach (var r in _recipRepo.GetRecipientByAction("To"))
            { _toCollection.Add(r); }
            EmailObj.To = _toCollection;

            foreach (var r in _recipRepo.GetRecipientByAction("CC"))
            { _ccCollection.Add(r); }
            EmailObj.CC = _ccCollection;

            foreach (var r in _recipRepo.GetRecipientByAction("BCC"))
            { _bccCollection.Add(r); }
            EmailObj.BCC = _bccCollection;

            return EmailObj;
        }

 public void BuildEmailData()
        {
            EmailDataBuilder builder = new EmailDataBuilder(EmailObject,CSGTemplateId);
            EmailObject = builder.BuildObject();
        }

public void PopulateEmailAddresses()
        {
            foreach (Recipient t in EmailObject.To)
            {
               var _user = RepoUser.GetUserById(t.Key);
               t.Email = _user.Email;
               t.Id = _user.Id;
             }
        }

Это не идеально, так как разбивает другой кусок на этот, который использует Linq to XML, но я могу понять это.

Ответы [ 2 ]

1 голос
/ 15 октября 2010

Поскольку .To настроил, выполните:

  • , создайте новый список получателей
  • , для каждого исходного получателя создайте новый и вставьте его в новый список
  • назначить новый список .To

Это должно работать.

1 голос
/ 15 октября 2010

Получатель - это структура?Возможно, измените его на класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...