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

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

我试图找出如何在 C# 4 中实现 method_missing,基于所有 2 篇关于 IDynamicObject 的博客文章。

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

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

最佳答案

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

这当然是在 this CodeProject page 上发生的事情.值得一试 :)

关于visual-studio-2010 - 我可以在 C# 4 中实现 method_missing 并让它实际返回一个值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/283143/

相关文章:

clr - .Net 4.0 会包含新的 CLR 还是保留 2.0 版

c# - 如何使用 C# 代码(不是 python)将静态类(或静态方法)导入 IronPython(或 DLR)?

C++ Visual Studio 2010 不链接 native 静态库

.net - ASP.NET 预编译为单个程序集

c - 是否可以从 C#.Net 调用 C 函数

c# - 关于 DLR (.NET 4.0 beta 1) 的最佳信息来源是什么?

c# - c# 4 中的 DLR 和 Javascript 解释?

wcf - Visual Studio : edit xaml while debugging (without stopping debugging)

visual-studio-2010 - VS2010中关闭双击取消停靠

c# - 动态关键字与对象数据类型