【问题标题】:Method member access on dynamic object invokes TryGetMember动态对象上的方法成员访问调用 TryGetMember
【发布时间】:2015-04-06 20:41:17
【问题描述】:

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

它(或多或少)就是这样:

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&lt;'1&gt;,我想在其上调用来自IEnumerable&lt;'1&gt; 的方法。

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

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

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

【问题讨论】:

  • 我无法复制您的问题。你能说明你是怎么打电话给Count()的吗?
  • 另外,Count 不是 IEnumerable 上的方法 - 它是一种扩展方法,编译器会将其转换为对静态方法 Enumerable.Count 的调用。

标签: c# .net reflection types expandoobject


【解决方案1】:

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

详情请参阅 [Extension method and dynamic object

【讨论】:

  • 我不太确定我是否理解正确。我一直认为扩展方法只是语法糖,可以转换为静态方法调用,并将成员作为第一个参数调用?所以 list.Count() 编译后变成 Enumerator.Count(list) ,所以这应该与实例是动态的、对象的或其他的没有任何关系?
  • 是的,没错,它是语法糖。这意味着它是在编译时完成的。似乎编译器应该知道您正在实例化一个 Dummy 类,因此应该在编译期间将动态对象视为 IEnumerable 但它实际上并没有这样做,因此它不知道要调用哪个静态方法。这有意义吗?
猜你喜欢
  • 1970-01-01
  • 2019-12-27
  • 2011-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多