#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>();
Мне интересно, если:
- Это возможно даже с C #?
- Если DynamicObject — неправильный базовый класс; должен ли я перейти к IDynamicMetaObjectProvider или чему-то еще?
- Нужно ли мне воспользоваться маршрутом DynamicBase для создания прокси вокруг ChildClass с требуемым комбинированным поведением, используя что-то вроде DynamicProxy для перехвата вызовов?
Ответ №1:
Это невозможно с dynamic
инфраструктурой, добавленной в 4.0. Простая реализация IDynamicMetaObjectProvider
не означает, что ваш класс будет полностью отменен .Разрешение типа / элемента СЕТИ. Это просто означает, что при ссылке на экземпляр в динамическом контексте вызовы, которые не могут быть разрешены иным образом статически, будут возвращены к динамическому поставщику.