0

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

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

这意味着专业会导致问题。

任何建议我如何解决这个问题?谢谢!

4

1 回答 1

0

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

这是一个快速工作的示例,它迭代“Person”对象的 Professions 属性并将ToString()表示转储到控制台 - 如果你想使用 FastMember 深入了解每个 Profession 对象ObjectAccessor,我猜你可以构造另一个来执行它 - 它不是迭代后明确你的目标是什么。

如果您ObjectAccessor直接从数组构建,则相同的策略将起作用-您只需检查 and 是否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;
    }
}
于 2019-09-24T14:41:17.753 回答