private GetSessionDelegate CreateTypeSessionGetter(Type reflectedType) { // Find all auto properties and fields that can contain a proxy var properties = reflectedType .GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public) .Where(o => o.IsAutoProperty(true)); // for non auto properties we will check the underlying field instead var fields = reflectedType .GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public) .Where(o => !o.Name.StartsWith("<")); // Ignore compiler generated fields var list = new List <GetSessionDelegate>(); foreach (var member in properties.Cast <MemberInfo>().Concat(fields)) { if (!BreezeContractResolver.IsAssociation(member, _entityMetadataProvider, out var isScalar, out var memberType)) { continue; } var parameter = Expression.Parameter(typeof(object)); var getValueFunc = Expression.Lambda <Func <object, object> >( Expression.Convert( Expression.MakeMemberAccess(Expression.Convert(parameter, reflectedType), member), typeof(object)), parameter) .Compile(); list.Add(isScalar ? CreateGetSessionFromEntityFunction(getValueFunc, GetOrCreateTypeSessionGetter) : CreateGetSessionFromCollectionFunction(getValueFunc, memberType, GetOrCreateTypeSessionGetter, IsEntityType)); } return(CreateTypeSessionGetter(list.ToArray())); }
/// <summary> /// Constructs an instance of <see cref="DefaultJsonSerializerSettingsProvider"/>. /// </summary> public DefaultJsonSerializerSettingsProvider(BreezeContractResolver breezeContractResolver) { _breezeContractResolver = breezeContractResolver; _serializerSettings = new Lazy <JsonSerializerSettings>(CreateJsonSerializerSettings, LazyThreadSafetyMode.PublicationOnly); _serializerSettingsForSave = new Lazy <JsonSerializerSettings>(CreateJsonSerializerSettingsForSave, LazyThreadSafetyMode.PublicationOnly); }