我可以在C#4中实现method_missing并让它实际返回一个值吗?

时间:2008-11-12 05:57:46

标签: visual-studio-2010 c#-4.0 dynamic-language-runtime idynamicobject

我试图弄清楚如何在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

3 个答案:

答案 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)
);

(仍然不确定原因,但它对我有用)。