对于通过反射找到的属性,我如何测试Listness并枚举它
本文关键字:测试 Listness 枚举 何测试 反射 于通过 属性 | 更新日期: 2023-09-27 18:03:53
当我不知道它的确切类型时,我如何测试类成员是否为列表?然后我怎么遍历它呢?
myc是MyClass的实例
using System.Reflection;
public class MyClass {
public sometype somename { get; set; }
public List<double> doubles { get; set; }
public List<string> strings { get; set; }
}
foreach(PropertyInfo pi in MyClass.GetProperties()) {
if (pi.GetValue(myc, null) is List<???>){ <--- what should this be?
foreach(object obj in pi.GetValue(myc, null)) { <---- doesn't work
}
var l = pi.GetValue(myc, null) as List<???> <---- doesn't work
}
}
如果您只想枚举这些值,那么您可以测试非泛型的IEnumerable
:
object value = pi.GetValue(myc, null);
IEnumerable enumerable = value as IEnumerable;
if (enumerable != null)
{
foreach (object obj in enumerable)
{
...
}
}
注意,这将遍历字符串中的字符,因为string
实现了IEnumerable<char>
。您可能想要硬编码来防止这种情况。
如果你对IList
的任何实现(包括List<T>
)都很满意,你可以用IList
代替上面的IEnumerable
。
请注意,这基本上是避免进入泛型-在反射中检测和使用泛型是一件混乱的事情。