У меня есть объект, определенный как
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, но я могу понять это.