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;
}
}
}