private static Union CreateUnion(Type t) { Union u = new Union(); u.TagReader = (FSharpFunction)FSharpUtils.PreComputeUnionTagReader(null, t, null); u.Cases = new List<UnionCase>(); object[] cases = (object[])FSharpUtils.GetUnionCases(null, t, null); foreach (object unionCaseInfo in cases) { UnionCase unionCase = new UnionCase(); unionCase.Tag = (int)FSharpUtils.GetUnionCaseInfoTag(unionCaseInfo); unionCase.Name = (string)FSharpUtils.GetUnionCaseInfoName(unionCaseInfo); unionCase.Fields = (PropertyInfo[])FSharpUtils.GetUnionCaseInfoFields(unionCaseInfo); unionCase.FieldReader = (FSharpFunction)FSharpUtils.PreComputeUnionReader(null, unionCaseInfo, null); unionCase.Constructor = (FSharpFunction)FSharpUtils.PreComputeUnionConstructor(null, unionCaseInfo, null); u.Cases.Add(unionCase); } return u; }
private Union CreateUnion(Type t) { Union u = new Union(); u.TagReader = FSharpFunc<object, int>.ToConverter(FSharpValue.PreComputeUnionTagReader(t, null)); u.Cases = new List<UnionCase>(); UnionCaseInfo[] cases = FSharpType.GetUnionCases(t, null); foreach (UnionCaseInfo unionCaseInfo in cases) { UnionCase unionCase = new UnionCase(); unionCase.Tag = unionCaseInfo.Tag; unionCase.Name = unionCaseInfo.Name; unionCase.Fields = unionCaseInfo.GetFields(); unionCase.FieldReader = FSharpFunc<object, object[]>.ToConverter(FSharpValue.PreComputeUnionReader(unionCaseInfo, null)); unionCase.Constructor = FSharpFunc<object[], object>.ToConverter(FSharpValue.PreComputeUnionConstructor(unionCaseInfo, null)); u.Cases.Add(unionCase); } return u; }
public UnionValueGetter(Union union, UnionCase unionCase) { mUnion = union; mCase = unionCase; }
public UnionConstructor(Union union, UnionCase unionCase) { mUnion = union; mCase = unionCase; }
/// <summary> /// Reads the JSON representation of the object. /// </summary> /// <param name="reader">The <see cref="JsonReader"/> to read from.</param> /// <param name="objectType">Type of the object.</param> /// <param name="existingValue">The existing value of object being read.</param> /// <param name="serializer">The calling serializer.</param> /// <returns>The object value.</returns> public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) { return(null); } UnionCase caseInfo = null; string caseName = null; JArray fields = null; // start object reader.ReadAndAssert(); while (reader.TokenType == JsonToken.PropertyName) { string propertyName = reader.Value.ToString(); if (string.Equals(propertyName, CasePropertyName, StringComparison.OrdinalIgnoreCase)) { reader.ReadAndAssert(); Union union = UnionCache.Get(objectType); caseName = reader.Value.ToString(); caseInfo = union.Cases.SingleOrDefault(c => c.Name == caseName); if (caseInfo == null) { throw JsonSerializationException.Create(reader, "No union type found with the name '{0}'.".FormatWith(CultureInfo.InvariantCulture, caseName)); } } else if (string.Equals(propertyName, FieldsPropertyName, StringComparison.OrdinalIgnoreCase)) { reader.ReadAndAssert(); if (reader.TokenType != JsonToken.StartArray) { throw JsonSerializationException.Create(reader, "Union fields must been an array."); } fields = (JArray)JToken.ReadFrom(reader); } else { throw JsonSerializationException.Create(reader, "Unexpected property '{0}' found when reading union.".FormatWith(CultureInfo.InvariantCulture, propertyName)); } reader.ReadAndAssert(); } if (caseInfo == null) { throw JsonSerializationException.Create(reader, "No '{0}' property with union name found.".FormatWith(CultureInfo.InvariantCulture, CasePropertyName)); } object[] typedFieldValues = new object[caseInfo.Fields.Length]; if (caseInfo.Fields.Length > 0 && fields == null) { throw JsonSerializationException.Create(reader, "No '{0}' property with union fields found.".FormatWith(CultureInfo.InvariantCulture, FieldsPropertyName)); } if (fields != null) { if (caseInfo.Fields.Length != fields.Count) { throw JsonSerializationException.Create(reader, "The number of field values does not match the number of properties defined by union '{0}'.".FormatWith(CultureInfo.InvariantCulture, caseName)); } for (int i = 0; i < fields.Count; i++) { JToken t = fields[i]; PropertyInfo fieldProperty = caseInfo.Fields[i]; typedFieldValues[i] = t.ToObject(fieldProperty.PropertyType, serializer); } } object[] args = { typedFieldValues }; return(caseInfo.Constructor.Invoke(args)); }
public UnionCaseChecker(Union union, UnionCase unionCase) { mUnion = union; mCase = unionCase; }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) { return(null); } UnionCase @case = null; string caseName = null; JArray array = null; reader.ReadAndAssert(); while (reader.TokenType == JsonToken.PropertyName) { string a = reader.Value.ToString(); if (string.Equals(a, "Case", StringComparison.OrdinalIgnoreCase)) { Func <UnionCase, bool> < > 9__0; reader.ReadAndAssert(); caseName = reader.Value.ToString(); if (< > 9__0 == null) { } @case = UnionCache.Get(objectType).Cases.SingleOrDefault <UnionCase>(< > 9__0 = c => c.Name == caseName); if (@case == null) { throw JsonSerializationException.Create(reader, "No union type found with the name '{0}'.".FormatWith(CultureInfo.InvariantCulture, caseName)); } } else { if (!string.Equals(a, "Fields", StringComparison.OrdinalIgnoreCase)) { throw JsonSerializationException.Create(reader, "Unexpected property '{0}' found when reading union.".FormatWith(CultureInfo.InvariantCulture, a)); } reader.ReadAndAssert(); if (reader.TokenType != JsonToken.StartArray) { throw JsonSerializationException.Create(reader, "Union fields must been an array."); } array = (JArray)JToken.ReadFrom(reader); } reader.ReadAndAssert(); } if (@case == null) { throw JsonSerializationException.Create(reader, "No '{0}' property with union name found.".FormatWith(CultureInfo.InvariantCulture, "Case")); } object[] objArray = new object[@case.Fields.Length]; if ((@case.Fields.Length != 0) && (array == null)) { throw JsonSerializationException.Create(reader, "No '{0}' property with union fields found.".FormatWith(CultureInfo.InvariantCulture, "Fields")); } if (array != null) { if (@case.Fields.Length != array.Count) { throw JsonSerializationException.Create(reader, "The number of field values does not match the number of properties defined by union '{0}'.".FormatWith(CultureInfo.InvariantCulture, caseName)); } for (int i = 0; i < array.Count; i++) { JToken token = array[i]; PropertyInfo info = @case.Fields[i]; objArray[i] = token.ToObject(info.PropertyType, serializer); } } object[] args = new object[] { objArray }; return(@case.Constructor.Invoke(args)); }