Я получаю некоторые данные из API, который является динамическим, и я хотел бы использовать отражение, чтобы строго напечатать эти данные для повторного использования в моем приложении.У меня есть трехуровневая иерархия объекта.
Я хотел бы использовать отражение, чтобы объединить определенные свойства одного типа в коллекцию.
Имея следующие классы:
Уровень 1:
public sealed class DynamicData
{
[JsonProperty(propertyName: "PersonInfo")]
public DynamicDataPersonInfo PersonInfo { get; set; }
[JsonProperty(propertyName: "Location")]
public DynamicDataLocation Location { get; set; }
}
Уровень 2:
public sealed class DynamicDataPersonInfo
{
[JsonProperty("title")]
public string Title { get; set; }
[JsonProperty("type")]
public string Type { get; set; }
[JsonProperty("properties")]
public DynamicDataPersonInfoProperties Properties { get; set; }
[JsonProperty("required")]
public string[] PersonInfoRequired { get; set; }
}
public sealed class DynamicDataLocation
{
[JsonProperty(propertyName: "title")]
public string Title { get; set; }
[JsonProperty(propertyName: "type")]
public string Type { get; set; }
[JsonProperty(propertyName: "properties")]
public DynamicDataLocationProperties Properties { get; set; }
[JsonProperty(propertyName: "required")]
public string[] LocationRequired { get; set; }
}
Уровень 3:
public sealed class DynamicDataLocationProperties
{
[JsonProperty(propertyName: "BuildingNumber")]
public DynamicDataFieldInfo BuildingNumber { get; set; }
[JsonProperty(propertyName: "UnitNumber")]
public DynamicDataFieldInfo UnitNumber { get; set; }
[JsonProperty(propertyName: "StreetName")]
public DynamicDataFieldInfo StreetName { get; set; }
[JsonProperty(propertyName: "StreetType")]
public DynamicDataFieldInfo StreetType { get; set; }
[JsonProperty(propertyName: "City")]
public DynamicDataFieldInfo City { get; set; }
[JsonProperty(propertyName: "StateProvinceCode")]
public DynamicDataFieldInfo StateProvinceCode { get; set; }
[JsonProperty(propertyName: "PostalCode")]
public DynamicDataFieldInfo PostalCode { get; set; }
}
public sealed class DynamicDataPersonInfoProperties
{
[JsonProperty(propertyName: "FirstGivenName")]
public DynamicDataFieldInfo FirstGivenName { get; set; }
[JsonProperty(propertyName: "MiddleName")]
public DynamicDataFieldInfo MiddleName { get; set; }
[JsonProperty(propertyName: "FirstSurName")]
public DynamicDataFieldInfo FirstSurName { get; set; }
[JsonProperty(propertyName: "DayOfBirth")]
public DynamicDataFieldInfo DayOfBirth { get; set; }
[JsonProperty(propertyName: "MonthOfBirth")]
public DynamicDataFieldInfo MonthOfBirth { get; set; }
[JsonProperty(propertyName: "YearOfBirth")]
public DynamicDataFieldInfo YearOfBirth { get; set; }
}
Окончательный уровень:
public sealed class DynamicDataFieldInfo
{
[JsonProperty(propertyName: "type")]
public string Type { get; set; }
[JsonProperty(propertyName: "description")]
public string Description { get; set; }
[JsonProperty(propertyName: "label")]
public string Label { get; set; }
}
Я пытаюсьсделать это как можно более универсальным, используя рефлексию, но для каждого уровня я использую цикл foreach.Вы знаете, куда это идет, и код выглядит ужасно, на мой взгляд:
private IReadOnlyList<DynamicProperty> CombineProperties(DynamicData deserializedRawData)
{
List<DynamicProperty> combinedDynamicProperties = new List<DynamicProperty>();
// dynamic data
foreach (PropertyInfo propertiyofDynamicData in deserializedRawData.GetType()
.GetProperties())
{
// dynamic data lower level
foreach (PropertyInfo propertyOfDynamicDataMember in propertiyofDynamicData.GetType()
.GetProperties()
.Where(predicate: x => x.Name == "Properties"))
{
foreach (PropertyInfo propertyOfFieldInfo in propertyOfDynamicDataMember.GetType()
.GetProperties())
{
DynamicDataFieldInfo dynamicDataFieldInfo = propertyOfFieldInfo.GetValue(propertyOfDynamicDataMember) as DynamicDataFieldInfo;
combinedDynamicProperties.Add(new DynamicProperty {DynamicDataFieldInfo = dynamicDataFieldInfo, GroupType = FormHelper.GetFormGroupType(propertiyofDynamicData.Name)});
}
}
}
return combinedDynamicProperties;
}
Есть ли способ, которым я могу избежать этого ужасного зацикливания?