我使用 FastMember 从对象和嵌套对象中获取值。如果属性是 astring
或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 }
]
}
这意味着职业会导致问题。
任何建议我如何解决这个问题?谢谢!
从source
变量的数据类型是什么的问题中并不明显,但您应该能够检查访问器返回的值是否实现IEnumerable
并采取相应的行动。
这是一个快速工作的示例,它遍历“Person”对象的 Professions 属性,然后将ToString()
表示转储到控制台 - 如果您想使用 FastMember 深入了解每个 Profession 对象,您可以构造另一个对象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;
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句