C# 未为有限可见性类型调用DynamicObject的TryConvert

C# 未为有限可见性类型调用DynamicObject的TryConvert,c#,microsoft-dynamics,dynamicobject,C#,Microsoft Dynamics,Dynamicobject,我想知道为什么将DynamicObject派生类的可见性更改为private会阻止框架调用TryConvert 即,以下代码输出如下所示: Calling TryGetMember Calling TryConvert 但如果我改变 public sealed class DynamicJsonObject 到private,它嵌套在DynamicJsonConverter中,然后 Calling TryGetMember InvalidCastException is thrown 无法

我想知道为什么将DynamicObject派生类的可见性更改为private会阻止框架调用TryConvert

即,以下代码输出如下所示:

Calling TryGetMember
Calling TryConvert
但如果我改变

public sealed class DynamicJsonObject
到private,它嵌套在DynamicJsonConverter中,然后

Calling TryGetMember
InvalidCastException is thrown
无法将类型为“DynamicJsonObject”的对象强制转换为类型为“System.Collections.Generic.IDictionary`2[System.String,System.object]

在CallSite.TargetClosure,CallSite,System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet]CallSite站点上的对象,T0 arg0

代码:


请向我们展示InvalidCastException的堆栈跟踪。给您:在CallSite.TargetClosure,CallSite,System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet]CallSite,T0 arg0处的对象
void Main()
{
   var serializer = new JavaScriptSerializer();
   serializer.RegisterConverters(new[] { new DynamicJsonConverter() });

   dynamic result = serializer.Deserialize("{ 'response' : { 'data' : '1', 's' : -1 } }", typeof(object));
   ((IDictionary<string, object>)result.response).Dump();
}

public sealed class DynamicJsonConverter : JavaScriptConverter
{
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        if (dictionary == null)
            throw new ArgumentNullException("dictionary");

        return type == typeof(object) ? new DynamicJsonObject(dictionary) : null;
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override IEnumerable<Type> SupportedTypes
    {
        get { return new ReadOnlyCollection<Type>(new List<Type>(new[] { typeof(object) })); }
    }

    public sealed class DynamicJsonObject : DynamicObject
    {
        private readonly IDictionary<string, object> _dictionary;       

        public DynamicJsonObject(IDictionary<string, object> dictionary)
        {
            if (dictionary == null)
                throw new ArgumentNullException("dictionary");
            _dictionary = dictionary;
        }

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            Console.WriteLine("Calling TryGetMember");
            if (!_dictionary.TryGetValue(binder.Name, out result))
            {
                result = null;
                return true;
            }
            var dictionary = result as IDictionary<string, object>;
            if (dictionary != null)
            {
                result = new DynamicJsonObject(dictionary);
                return true;
            }
            var arrayList = result as ArrayList;
            if (arrayList != null && arrayList.Count > 0)
            {
                if (arrayList[0] is IDictionary<string, object>)
                    result = new List<object>(arrayList.Cast<IDictionary<string, object>>().Select(x => new DynamicJsonObject(x)));
                else
                    result = new List<object>(arrayList.Cast<object>());
            }
            return true;
        }

        public override bool TryConvert(ConvertBinder binder, out object result)
        {
            Console.WriteLine("Calling TryConvert");
            result = null;
            if (binder.Type == typeof(IDictionary<string, object>))
            {
                result = _dictionary;
                return true;
            }           
            return base.TryConvert(binder, out result);
        }       
    }
}