Мне нужно иметь возможность отслеживать большое количество объектов на предмет изменений.Почти в любом случае я мог бы просто использовать INotifyPropertyChanged
и назвать это днем.Однако моя ситуация не так проста.Цель моего проекта - создать симуляцию, в которой любой объект может быть подключен, отслежен и доступен.
Подключение выполняется с помощью отражения с помощью Fluent API, который определяет свойства и поля для включения в среду моделирования.Это выглядит примерно так:
public void DeclareVariables( IVariableBuilder builder )
{
builder.Include( x => x.PropertyA );
builder.Include( x => x.FieldA );
}
Свойства и поля затем оборачиваются в класс Variable
и сохраняются в классе Environment
.
public class Variable<T> : IVariable
{
private FieldInfo _field; // Properties are turned into FieldInfo via k__BackingField
private object _obj;
public string Id
{
get => $"{_obj.GetType}-{_field.Name}";
}
public T Value
{
get => _field.GetValue( _obj );
}
}
public class Environment
{
private Dictionary<string, IVariable> _variables;
}
Это правильно хранит ссылкико всем полям и свойствам, которые я пытаюсь включить. Однако я хочу иметь возможность отслеживать все эти изменения, и большинство включенных полей являются либо классами с закрытым исходным кодом, либо примитивами, которые не реализуют INotifyPropertyChanged` или не могут быть получены.
Я пришел из фона JavaScript, где вы можете сделать это, создав прокси-объект объекта, который может переопределять методы получения и установки свойств, а так как JavaScript имеет тип утка, вы можете просто заменить фактический экземпляр объекта на местепрокси.
Есть ли способ сделать то же самое в C #?Я полагаю, что правила безопасности типов в C # не допускают такой практики, особенно с примитивами.Однако, насколько мне известно, единственный способ отслеживать эти классы - это каким-то образом перехватывать операции, в которых устанавливается значение.