Как получить значение свойства вложенных классов с помощью отражения
В настоящее время в моем классе DataEntries у меня есть подкласс, UserObjects и TagObjects. Я пытаюсь получить доступ к свойствам TagObjects в моем тестовом классе.. У меня есть еще один класс, где эти объекты сериализуются, который является классом DataProvider. Я использую этот помощник отражения, но я не могу выбрать свойства. Моя цель состоит в том, чтобы получить ответ от API и поместить этот идентификатор ответа в свойство, которому я говорю своему помощнику по отражению назначить его. Я успешно получаю ответ от API, но затем не могу поместить значение ответа в выбранное мной свойство в классе DataEntries подкласса TagObjects
//Here is the class of DataEntries public class DataEntries { public class UserObjects { public string UserId { get; set; } public string UserId2 { get; set; } } public class TagObjects { public int id { get; set; } public string name { get; set; } public int type { get; set; } public TagObjects Child { get; set; } } }
Что я уже пробовал:
//Refection helper public static class ReflectionHelper { public static dynamic GetPropValue(this Object obj, String propName) { string[] nameParts = propName.Split('.'); if (nameParts.Length == 1) { return obj.GetType().GetProperty(propName).GetValue(obj, null); } foreach (String part in nameParts) { if (obj == null) { return null; } Type type = obj.GetType(); PropertyInfo info = type.GetProperty(part); if (info == null) { return null; } obj = info.GetValue(obj, null); } return obj; } }
Не уверен что это поможет вот мой класс DataProvider и метод для того чтобы помочь разместить мои параметры запроса при вызове API
public class DataProvider { public DataEntries DataEntries { get; private set; } public DataProvider () { DataEntries = new DataEntries(); } public Dictionary<string, object> DataProviderQueryParams(dynamic matchKey) { DataEntries dataEntries = new DataEntries(); string data = JsonConvert.SerializeObject(dataEntries); Dictionary<string, object> Items = JsonConvert.DeserializeObject<Dictionary<string, object>>(data); if (Items.TryGetValue(matchKey, out object value)) { return new Dictionary<string, object> { { matchKey, value } }; } return null; } }
Использование тестового класса
public class TestClass { DataProvider dataprovider = new DataProvider(); [Test] public void GetTagList() { parsedResponse = JToken.Parse(HttpGet(baseUrl, TestUtil.BasePath(), token, client).Content); tagId = parsedResponse.Last["id"].ToString(); var tagId = dataprovider.GetPropValue("DataEntries.id"); // Getting TagId as Null.. } }