В моем классе у меня есть частный словарь C #, где ключом является строка, а значением является объект, имеющий событие PropertyChanged
. Определено как ниже:
private readonly Dictionary<string, IAlsVariable> m_operatorAudibleSevServerVariables = new Dictionary<string, IAlsVariable>();
В моем конструкторе у меня есть следующий foreach, который заполняет Dictionary
:
foreach (var clusterManager in clusterManagers)
{
var clusterName = clusterManager.Name;
string opcDataSourceServer = "server/" + clusterName + ":[2:http://www.alstom.com/Transport/Iconis/S2K/Data]<Organizes>2:S2KServer<Organizes>2:S2KTerritoryMngt<Organizes>2:TASSObject<HasComponent>2:OperatorAudibleSev";
var opcVariable = m_alsApplication.Database.GetVariable(opcDataSourceServer, null);
opcVariable.PropertyChanged += OpcVariable_PropertyChanged;
m_operatorAudibleSevServerVariables.Add(clusterManager.Name, opcVariable);
}
Как вы можете видеть, прежде чем я добавлю экземпляр каждой переменной (значения) в словарь, я также подпишусь на событие PropertyChanged
каждой переменной.
Теперь, когда один из экземпляров переменных запускает событие PropertyChanged
, я выполняю (один) обработчик события. Проблема в том, что я не знаю, какая из переменных в словаре вызвала событие PropertyChanged
.
У меня есть метод с именем UpdateAlarmSound
, который мне нужно вызывать всякий раз, когда происходит это событие. Первый параметр, который мне нужно передать этому методу, - это ключ связанной переменной из словаря.
Мое первое предположение - привести переменную и затем использовать это значение для поиска ключа. Но я не знаю, является ли это надежным способом сделать это. Код ниже это то, что у меня есть. Кажется, это работает, но у меня есть некоторые сомнения, что, может быть, есть другой лучший способ. Или, может быть, мой способ работает, но это неправильно. Может быть, я должен использовать .Equals
вместо ==
.
private void OpcVariable_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
var opcVariable = sender as IAlsVariable;
var key = m_operatorAudibleSevServerVariables.FirstOrDefault(x => x.Value == opcVariable).Key;
UpdateAlarmSound(key, Convert.ToInt32(opcVariableVtqValue));
}