标签: idynamicobject

你如何实现C#4的IDynamicObject接口?

要在C#4.0中实现"方法缺失" - 语义等,您必须实现IDynamicObject:

public interface IDynamicObject
{
  MetaObject GetMetaObject(Expression parameter);
}
Run Code Online (Sandbox Code Playgroud)

据我所知,IDynamicObject实际上是DLR的一部分,所以它不是新的.但我还没有找到很多关于它的文件.

有一些非常简单的示例实现(这里这里的 fx ),但是有人能指出更完整的实现或一些真正的文档吗?

特别是,你究竟应该如何处理"参数" - 参数?

dynamic-language-runtime dynamic idynamicobject c#-4.0

6
推荐指数
1
解决办法
5061
查看次数

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

我试图根据 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);                        
    }
} 
Run Code Online (Sandbox Code Playgroud)

在 RepositoryMetaObect 中,我实现 Call 方法,如下所示:

    public override MetaObject Call(CallAction action, MetaObject[] args)
    {
        typeof(T).GetMethod(action.Name).Invoke(_Repository, getParameterArray(args));
        return this;            
    }
Run Code Online (Sandbox Code Playgroud)

(RepositoryMetaObject 代码的其余部分可能并不有趣,但我已将其包含在此处: http: //pastie.org/312842

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

现在当我这样做时:

        dynamic service = new CustomerServices();
        var myCustomer = service.GetByID(1); 
Run Code Online (Sandbox Code Playgroud)

GetByID 被调用,但如果我尝试访问 myCustomer 上的属性,它就会挂起。

有人可以帮忙吗?

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

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

5
推荐指数
1
解决办法
937
查看次数