对于通过反射找到的属性,我如何测试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 
     }
}

对于通过反射找到的属性,我如何测试Listness并枚举它

如果您只想枚举这些值,那么您可以测试非泛型的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

请注意,这基本上是避免进入泛型-在反射中检测和使用泛型是一件混乱的事情。