我正在使用反射来获取特定对象的所有属性并迭代它们。
我正在调用这些属性props
。
当这些是非List对象时,一切正常。
我需要一种方法来知道我迭代的道具是什么时候是一个列表(例如,我看到有一个prop.PropertyType.IsArray
,但不是列表中的一个。)
我在这里看到Determine if a property is a kind of array by reflection他们建议使用:
property.PropertyType.GetInterface(typeof(IEnumerable<>).FullName) != null
但是这对我来说还不够好,因为string
也实现了这一点。
(现在我正在检查prop.Namespace
中是否包含“集合”,显然正在寻找更好的方法。
在我完成之后,我有一个工作假设,List将是一个复杂对象的List。 (但可能是几个复杂的对象中的一个,所以我不知道哪个)
更难的部分是我需要迭代这些对象并获得 他们的 成员,但未能这样做。
因此,如果我List<TestObject>
为prop
,我需要以某种方式(概念上)foreach (TestObject testObj in prop)
。
没有合理的尝试在这里显示,因为我还没有找到一种方法将prop
视为我的复杂对象的列表并迭代它。
编辑:我已设法通过prop.GetValue(reflectedObject)
获得价值,但我必须将其转换为List<MyComplexObject>
答案 0 :(得分:0)
我认为使用IEnumerable<>
界面实际上是前进的方向。你有什么类型的基础类型的对象?如果是,那么您可以解决string
的问题,寻找扩展基类型的对象集合。如果不是,那么在检查IEnumerable<>
接口之前,您可以将字符串视为特殊情况。
答案 1 :(得分:0)
我认为调查此代码示例可以提供帮助。
public class MyClass
{
public string Name { get; set; }
public int Id { get; set; }
public List<int> Subordinates { get; set; }
}
使用MyClass:
var myClass = new MyClass
{
Id = 1,
Name = "My Name",
Subordinates = new List<int> { 2, 5, 8 }
};
var props = myClass.GetType().GetProperties();
foreach (var info in props)
{
var type = info.PropertyType;
if (type.IsGenericType && (type.GetGenericTypeDefinition() == typeof(List<>)))
{
foreach (var listitem in info.GetValue(myClass, null) as IEnumerable)
{
Console.WriteLine("Item: " + listitem.ToString());
}
continue;
}
Console.WriteLine(info.GetValue(myClass, null));
}