Мониторинг вызовов нединамических методов при работе с дочерними классами, наследуемыми от DynamicObject

#c# #.net #oop #dynamic

#c# #.net #ооп #динамический

Вопрос:

Допустим, у меня есть класс, который наследуется от DynamicObject:

 public class DynamicBase : DynamicObject
{
   public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
      //Yadda yadda yadda
    }

    //same for TrySetMember
}
  

и затем у меня есть дочерний класс, который наследуется от DynamicBase:

 public class ChildClass : DynamicBase
{
   public void SomeProperty { get; set; }
}
  

Я хотел бы автоматически отслеживать как средство получения, так и средство установки «SomeProperty» в дочернем классе. В настоящее время, поскольку в дочернем классе существует SomeProperty, методы не перенаправляются в TryGet / SetMember или любое другое переопределение DynamicObject.

В идеале я хотел бы такого поведения после того, как пользователь базового класса создаст экземпляр объекта, вот так:

 var someInstance = new ChildClass();
someInstance.SomeProperty = "someValue" //Monitored somehow in DynamicBase
  

в отличие от необходимости создавать экземпляр DynamicBase с дочерним объектом, переданным как тип (именно так Moq создает перехватчики с использованием DynamicProxy):

 var someInstance = new DynamicBase<ChildClass>();
  

Мне интересно, если:

  1. Это возможно даже с C #?
  2. Если DynamicObject — неправильный базовый класс; должен ли я перейти к IDynamicMetaObjectProvider или чему-то еще?
  3. Нужно ли мне воспользоваться маршрутом DynamicBase для создания прокси вокруг ChildClass с требуемым комбинированным поведением, используя что-то вроде DynamicProxy для перехвата вызовов?

Ответ №1:

Это невозможно с dynamic инфраструктурой, добавленной в 4.0. Простая реализация IDynamicMetaObjectProvider не означает, что ваш класс будет полностью отменен .Разрешение типа / элемента СЕТИ. Это просто означает, что при ссылке на экземпляр в динамическом контексте вызовы, которые не могут быть разрешены иным образом статически, будут возвращены к динамическому поставщику.