4

我试图根据 IDynamicObject 上浮动的所有 2 篇博客文章来弄清楚如何在 C# 4 中实现 method_missing。

我想要做的是有一个具有存储库的业务逻辑层,如果业务逻辑层缺少该方法,只需调用存储库并传递其结果。所以我有一个看起来像这样的类:

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

我认为的问题是我从来没有对调用的结果做任何事情,我只是返回 MetaObject 本身。

现在当我这样做时:

        dynamic service = new CustomerServices();
        var myCustomer = service.GetByID(1); 

调用 GetByID,但如果我尝试访问 myCustomer 上的属性,则只是挂起。

有人可以帮忙吗?

完整代码可以在ehre下载:https ://dl.getdropbox.com/u/277640/BusinessLogicLayer.zip

4

3 回答 3

1

我相信您需要返回一个新的 MetaObject,并将返回值作为常量表达式。

这肯定是在这个 CodeProject 页面上发生的事情。值得一试 :)

于 2008-11-12T06:58:09.377 回答
0

代替

return this;

尝试做这样的事情

return RepositoryMetaObject<CustomerRepository>(
       _Repository
     , System.Linq.Expressions.Expression.Constant(returnValue, returnValueType)
);

(仍然不确定为什么,但它对我有用)。

于 2008-12-09T19:04:35.853 回答
0

但如果我尝试访问 myCustomer 上的属性,就会挂起

能否在 service.GetByID(1) 之后的行上设置断点?看看你从那个电话中真正得到了什么。否则很难说到底发生了什么。

于 2008-11-13T03:53:26.630 回答