Я пытался понять, как реализовать 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, он просто зависает.
Кто-нибудь может помочь?
Полный код можно скачать на ehre: https://dl.getdropbox.com/u/277640/BusinessLogicLayer.zip





Я считаю, что вам нужно вернуть новый MetaObject с возвращенным значением в виде константного выражения.
Это определенно то, что происходит на эта страница CodeProject. Стоит попробовать :)
but if I try to access a property on myCustomer, is just hangs
Можете ли вы установить точку останова на строке после service.GetByID (1)? Посмотрите, что вы действительно получили от этого звонка. Иначе сложно сказать, что именно произошло.
Вместо
return this;
Попробуй сделать что-то вроде этого
return RepositoryMetaObject<CustomerRepository>(
_Repository
, System.Linq.Expressions.Expression.Constant(returnValue, returnValueType)
);
(все еще не уверен, почему, но у меня это работает).
отлично сформулированный и описанный вопрос, со всей информацией, необходимой для ответа, большой палец вверх от меня