使用 FastMember 从 collections 中获取值

Get values out of collections with FastMember

我使用 FastMember 从 object 和嵌套的 object 中获取值。如果 属性 是 stringint 一切正常。但现在我也想获得 collections 的值。到目前为止,这是我的代码:

// 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
    }
}

object 可能如下所示:

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

也就是说职业会出问题

有什么建议可以解决这个问题吗?谢谢!

从问题中看不出 source 变量的数据类型是什么,但您应该能够检查访问器返回的值是否实现 IEnumerable 并采取行动因此。

这是一个快速运行的示例,它迭代 'Person' 对象的职业 属性 并将 ToString() 表示转储到控制台 - 如果您想深入了解每个职业使用 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;
    }
}