2015-02-06 82 views
0

我有一个自定义的动态对象,它在内部只是一个字典,但允许访问它的值,就好像它们是编译时间属性一样。动态对象调用方法成员访问TryGetMember

它(或多或少)只是这样的:

public class Dummy : DynamicObject, IEnumerable<KeyValuePair<string, object>> 
{ 
    private readonly Dictionary<string, object> _values... 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     result = _values[binder.Name]; 
     return true; 
    } 
    ... 

设置和获取“属性”优良工程,但因为我的目标在技术上实现了IEnumerable<'1>,我想呼吁从IEnumerable<'1>方法。

但是,每当我打电话给Count()TryGetMember被调用这当然是没有意义的:

The key 'Count()' was not present in the dictionary. 

有没有办法来解决这个问题?

+0

我无法复制您的问题。你能告诉你如何调用Count()吗? – 2015-02-06 16:32:51

+0

此外,'Count'不是'IEnumerable'上的方法 - 它是一个_extension方法,编译器将其转换为对静态方法“Enumerable.Count”的调用。 – 2015-02-06 16:33:48

回答

0

简单地说,你不能使用扩展方法使用正常语法的动态对象。你可以使用Enumerable.Count(dummyInstance);,但我怀疑这是你想要的。

详情请参阅[Extension method and dynamic object

+0

我不太确定,如果我正确理解这一点。我一直认为扩展方法只是语法上的糖,它可以转化为一个静态方法调用,并且调用成员作为第一个参数?所以list.Count()在编译后变成Enumerator.Count(list),所以这不应该与实例是动态的,还是对象,或其他什么有关? – xvdiff 2015-02-06 17:25:45

+0

是的,确切地说,它是句法糖。这意味着它在编译时完成。看起来编译器应该知道你正在实例化一个Dummy类,因此应该在编译期间把这个动态对象看作一个IEnumerable对象,但实际上并没有这样做,因此它不知道要调用哪个静态方法。那有意义吗? – Jessica 2015-02-06 17:44:20