我试图弄清楚如何在C#4中实现method_missing,基于在IDynamicObject上漂浮的所有2篇博文。
我想要做的是拥有一个具有存储库的业务逻辑层,如果业务逻辑层中缺少该方法,只需调用存储库并传递其结果。所以我有一个看起来像这样的课程:
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
答案 0 :(得分:1)
我相信你需要返回一个新的MetaObject,并将返回值作为常量表达式。
这肯定发生在this CodeProject page上。值得一试:))
答案 1 :(得分:0)
但如果我尝试访问myCustomer上的属性,则只是挂起
你可以在service.GetByID(1)之后的行上设置一个断点吗?看看你从那次电话中得到了什么。否则,很难说出究竟发生了什么。
答案 2 :(得分:0)
而不是
return this;
尝试做这样的事情
return RepositoryMetaObject<CustomerRepository>(
_Repository
, System.Linq.Expressions.Expression.Constant(returnValue, returnValueType)
);
(仍然不确定原因,但它对我有用)。