Получите ценности из коллекций с FastMember - PullRequest
0 голосов
/ 24 сентября 2019

Я использую FastMember для получения значений из объектов и вложенных объектов.Если свойство является string или int, все работает нормально.Но теперь я хочу получить значения также для коллекций.Вот мой код:

// Set accessor
var sourceAccessor = ObjectAccessor.Create(source);

if (sourceAccessor.Target.GetType().GetInterface(nameof(ICollection)) != null || sourceAccessor.Target.GetType().GetInterface(nameof(IEnumerable)) != null)
{
    foreach (/* idk */)
    {
        // READ & RETURN VALUES HERE
    }
}

Объект может выглядеть следующим образом:

{
Id: 1,
Surname: Doe,
Prename: John,
Professions: [
    { Name: ab },
    { Name: xy }
]
}

Что означает, что профессии могут привести к проблеме.

Любой совет, какЯ могу решить эту проблему?Спасибо!

1 Ответ

0 голосов
/ 24 сентября 2019

Из вопроса о том, что является типом данных переменной source, не очевидно, но вы должны просто иметь возможность проверить, реализует ли значение, возвращаемое средством доступа, IEnumerable или нет, и действовать соответствующим образом.

Вот быстрый пример, который перебирает свойство Professions объекта Person и просто выводит представление ToString() на консоль - если вы хотите погрузиться в каждый объект Profession, используя FastMember, вы можете создать еще один ObjectAccessor длясделайте это, я полагаю - неясно, какова ваша цель после итерации.

Та же тактика будет работать, если вы создаете ObjectAccessor непосредственно из массива - вы просто проверяете, если accessor.Target is IEnumerable и выполняйте приведение и повторение аналогичным образом.

class Program
{
    static void Main(string[] args)
    {
        var p = new Person
        {
            Professions = new List<Profession>
            {
                new Profession("Joker"),
                new Profession("Smoker"),
                new Profession("Midnight toker")
            }
        };

        var accessor = ObjectAccessor.Create(p);
        var professions = accessor[nameof(Person.Professions)];

        if (professions is IEnumerable)
        {
            foreach (var profession in (IEnumerable)professions)
            {
                Console.WriteLine(profession);
            }
        }
    }
}

class Person
{
    public List<Profession> Professions { get; set; }
}

class Profession
{
    public string Name { get; set; }

    public Profession( string name)
    {
        Name = name;
    }

    public override string ToString()
    {
        return Name;
    }
}
...