Я пытаюсь использовать Шаблон посетителя, и у меня есть следующее:
public class EnumerableActions<T> : IEnumerableActions<T>
{
private IEnumerable<T> itemsToActOn;
public EnumerableActions ( IEnumerable<T> itemsToActOn )
{
this.itemsToActOn = itemsToActOn;
}
public void VisitAllItemsUsing ( IVisitor<T> visitor )
{
foreach (T t in itemsToActOn)
{
visitor.Visit ( t );// after this, the item is unaffected.
}
}
Посетитель:
internal class TagMatchVisitor : IVisitor<Tag>
{
private readonly IList<Tag> _existingTags;
public TagMatchVisitor ( IList<Tag> existingTags )
{
_existingTags = existingTags;
}
#region Implementation of IVisitor<Tag>
public void Visit ( Tag newItem )
{
Tag foundTag = _existingTags.FirstOrDefault(tg => tg.TagName.Equals(newItem.TagName, StringComparison.OrdinalIgnoreCase));
if (foundTag != null)
newItem = foundTag; // replace the existing item with this one.
}
#endregion
}
И куда я звоню посетителю:
IList<Tag> tags = ..get the list;
tags.VisitAllItemsUsing(new TagMatchVisitor(existingTags));
Итак ... где я теряю ссылку?
после newItem = foundTag - я ожидаю, что в foreach в посетителе у меня будет новое значение - очевидно, этого не происходит.
Редактировать Я думаю, что нашел ответ - в foreach переменная доступна только для чтения.
http://discuss.joelonsoftware.com/default.asp?dotnet.12.521767.19