Я пытался выяснить, как реализовать method_missing в C # 4, основываясь на всех двух сообщениях в блоге, плавающих вокруг IDynamicObject.
Что я хочу сделать, так это иметь уровень бизнес-логики, в котором есть репозиторий, и если метод отсутствует в уровне бизнес-логики, просто вызовите репозиторий и передайте его результат. Итак, у меня есть класс, который выглядит так:
public class CustomerServices : IDynamicObject
{
protected CustomerRepository _Repository = new CustomerRepository();
MetaObject IDynamicObject.GetMetaObject(Expression parameter)
{
return new RepositoryMetaObject<CustomerRepository>(_Repository, parameter);
}
}
В RepositoryMetaObect я реализую метод Call следующим образом:
public override MetaObject Call(CallAction action, MetaObject[] args)
{
typeof(T).GetMethod(action.Name).Invoke(_Repository, getParameterArray(args));
return this;
}
(Остальной код RepositoryMetaObject, вероятно, не интересен, но я включил его здесь: http://pastie.org/312842)
Проблема в том, что я ничего не делаю с результатом Invoke, я просто возвращаю сам MetaObject.
Теперь, когда я делаю это:
dynamic service = new CustomerServices();
var myCustomer = service.GetByID(1);
GetByID вызывается, но если я пытаюсь получить доступ к свойству на myCustomer, это просто зависает.
Может кто-нибудь помочь, пожалуйста?
Полный код можно скачать здесь: https://dl.getdropbox.com/u/277640/BusinessLogicLayer.zip