Je suis en train d'utiliser le modèle des visiteurs et je comme suit:Où est-ce que je perds la référence?
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.
}
}
Le visiteur:
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
}
Et où j'appelle le visiteur:
IList<Tag> tags = ..get the list;
tags.VisitAllItemsUsing(new TagMatchVisitor(existingTags));
Alors ... où est-ce que je perds la référence? après newItem = foundTag - Je m'attends à ce que dans le foreach du visiteur j'aurais la nouvelle valeur - évidemment, cela ne se produit pas.
Édition Je pense avoir trouvé la réponse - dans une variable foron, readonly.
http://discuss.joelonsoftware.com/default.asp?dotnet.12.521767.19
Dans ce cas, considérez la méthode LINQ Enumerable.Select (pour IEnumerable) ou la liste .ConvertAll - les deux effectuent ce type de projection. –