in src/YouTrackSharp/Issues/Issue.cs [505:558]
public override bool TrySetMember(SetMemberBinder binder, object value)
{
// "field" setter when deserializing JSON into Issue object
if (string.Equals(binder.Name, "field", StringComparison.OrdinalIgnoreCase) && value is JArray array)
{
var fieldElements = array.ToObject<List<Field>>();
foreach (var fieldElement in fieldElements)
{
if (fieldElement.Value is JArray fieldElementAsArray)
{
// Map collection
// Heuristics for finding fields of the type List<Assignee>
var children = new List<JToken>(fieldElementAsArray.First.Children());
if (children.Count == 2 && children[0] is JProperty && ((JProperty)children[0]).Name == "value"
&& children[1] is JProperty && ((JProperty)children[1]).Name == "fullName")
{
// For assignees, we can do a strong-typed list.
fieldElement.Value = fieldElementAsArray.ToObject<List<Assignee>>();
}
else
{
if (fieldElementAsArray.First is JValue &&
JTokenTypeUtil.IsSimpleType(fieldElementAsArray.First.Type))
{
// Map simple arrays to a collection of string
fieldElement.Value = fieldElementAsArray.ToObject<List<string>>();
}
else
{
// Map more complex arrays to JToken[]
fieldElement.Value = fieldElementAsArray;
}
}
}
// Set the actual field
_fields[fieldElement.Name] = fieldElement;
}
return true;
}
// Regular setter
if (_fields.TryGetValue(binder.Name, out var field) || _fields.TryGetValue(binder.Name.Replace("_", " "), out field))
{
field.Value = value;
}
else
{
_fields.Add(binder.Name, new Field { Name = binder.Name, Value = value });
}
return true;
}