Member 14779968 Ответов: 1

Как получить значение свойства вложенных классов с помощью отражения


В настоящее время в моем классе 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..
    }
}

1 Ответов

Рейтинг:
2

Richard Deeming

Как показано, ваш 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; }
    }
    
    public UserObjects User { get; set; }
    public TagObjects Tag { get; set; }
}
тогда ваш код отражения будет работать так, как ожидалось:
var entry = new DataEntries
{
    User = new DataEntries.UserObjects
    {
        UserId = "42",
        UserId2 = "64",
    },
    Tag = new DataEntries.TagObjects
    {
        id = 42,
        name = "Ford",
        type = 11,
    },
};

var value = entry.GetPropValue("Tag.name");
Console.WriteLine(value);
// Output: Ford
Демонстрация[^]