Я думаю, что вам нужен только один словарь и соответствующий класс виджетов, который содержит ссылки на другие виджеты. Это может помочь сделать его пользовательским словарем, чтобы вы могли просто добавить виджет и получить его из ключа FilePath виджета.
public class WidgetDictionary : Dictionary<string,Widget>
{
... provide suitable constructors ...
public void Add( Widget widget )
{
if (widget != null && !this.ContainsKey( widget.FilePath ))
{
this.Add( widget.FilePath, widget );
}
}
}
public class Widget
{
public string FilePath { get; set; }
private List<Widget> widgets = new List<Widget>();
public IEnumerable<Widget> Widgets
{
get { return widgets; }
}
...code to add/remove widgets from list...
}
Затем, чтобы сделать (1), вы просто просматриваете виджет в хранилище виджетов по пути к файлу.
var repository = new WidgetDictionary();
string filePath = ...
var widget = repository[filePath];
Чтобы сделать (2), вы можете удалить и повторно добавить виджет в хранилище после изменения его пути к файлу. Ссылки на виджет, хранящийся в других виджетах, будут по-прежнему действительны.
var widget = repository[filePath];
repository.Remove(filePath);
widget.FilePath = newFilePath;
repository.Add(widget);
EDIT: this could probably be implemented as a method on the
dictionary as well.
public void UpdatePath( Widget widget, string newPath )
{
if (string.IsNullOrEmpty(newPath))
throw new ArgumentNullException( "newPath" );
var widget = this.ContainsKey(widget.FilePath)
? this[widget.FilePath]
: null;
if (widget != null)
{
this.Remove(widget.FilePath);
}
widget.FilePath = newPath;
this.Add( widget );
}
Чтобы сделать (3), просто укажите свойство.
var filePath = widget.FilePath;
Если вы хотите, чтобы другие виджеты автоматически удаляли свои ссылки на виджет при его удалении (удалении), вы, вероятно, захотите, чтобы класс Widget реализовал IDisposable и имел возможность добавлять обработчики событий в событие dispose, чтобы что заинтересованные виджеты могут зарегистрировать метод, который удалит размещаемый виджет из их коллекции связанных виджетов. См. этот раздел MSDN о том, как настроить и использовать обработчики событий.