我使用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 }
]
}这意味着职业会导致一个问题。
有什么建议可以解决这个问题吗?谢谢!
发布于 2019-09-24 22:41:18
从这个问题可以看出,source变量的数据类型并不明显,但是您应该能够检查访问器返回的值是否实现了IEnumerable,并采取相应的操作。
这里有一个快速工作的例子,它迭代了一个'Person‘对象的Professions属性,并将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;
}
}https://stackoverflow.com/questions/58077868
复制相似问题