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

Допустим, у меня есть класс, который наследуется от 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 Ответ

1 голос
/ 11 сентября 2012

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

...