using System; using System.Dynamic; using System.Runtime.CompilerServices; using DPumpHydr.WinFrmUI.WenSkin.Json.Utilities; namespace DPumpHydr.WinFrmUI.WenSkin.Json.Serialization { /// /// Contract details for a used by the . /// public class JsonDynamicContract : JsonContainerContract { private readonly ThreadSafeStore>> _callSiteGetters = new ThreadSafeStore>>(CreateCallSiteGetter); private readonly ThreadSafeStore>> _callSiteSetters = new ThreadSafeStore>>(CreateCallSiteSetter); /// /// Gets the object's properties. /// /// The object's properties. public JsonPropertyCollection Properties { get; private set; } /// /// Gets or sets the property name resolver. /// /// The property name resolver. public Func PropertyNameResolver { get; set; } private static CallSite> CreateCallSiteGetter(string name) { return CallSite>.Create(new NoThrowGetBinderMember((GetMemberBinder)DynamicUtils.BinderWrapper.GetMember(name, typeof(DynamicUtils)))); } private static CallSite> CreateCallSiteSetter(string name) { return CallSite>.Create(new NoThrowSetBinderMember((SetMemberBinder)DynamicUtils.BinderWrapper.SetMember(name, typeof(DynamicUtils)))); } /// /// Initializes a new instance of the class. /// /// The underlying type for the contract. public JsonDynamicContract(Type underlyingType) : base(underlyingType) { ContractType = JsonContractType.Dynamic; Properties = new JsonPropertyCollection(base.UnderlyingType); } internal bool TryGetMember(IDynamicMetaObjectProvider dynamicProvider, string name, out object value) { ValidationUtils.ArgumentNotNull(dynamicProvider, "dynamicProvider"); CallSite> callSite = _callSiteGetters.Get(name); object obj = callSite.Target(callSite, dynamicProvider); if (obj != NoThrowExpressionVisitor.ErrorResult) { value = obj; return true; } value = null; return false; } internal bool TrySetMember(IDynamicMetaObjectProvider dynamicProvider, string name, object value) { ValidationUtils.ArgumentNotNull(dynamicProvider, "dynamicProvider"); CallSite> callSite = _callSiteSetters.Get(name); return callSite.Target(callSite, dynamicProvider, value) != NoThrowExpressionVisitor.ErrorResult; } } }