确定匿名类型的属性是否为泛型集合

3

我需要一种方法来循环遍历每个对象的属性并记录属性名和值。然而,偶尔会遇到一个列表对象的属性,整个过程就会崩溃。我从各种SO帖子中收集了下面的条件,但它每次都返回false。想知道如何测试您的方法属性是否为通用集合类型?

类定义

public class DtccProducer
{
    public string ProducerDateOfBirth { get; set; }
    public string ProducerGender { get; set; }
    public string TransactionType { get; set; }
    public List<BigAddress> Addresses { get; set; }
    public List<BigCommunicationItem> Communications { get; set; }
}

方法

    private static void ParseProducer(object obj)
    {
        StringBuilder s = new StringBuilder();
        Type objType = obj.GetType();

        foreach (PropertyInfo info in objType.GetProperties())
        {
            string key = info.Name;

            Type propType = info.PropertyType;

            if (propType.IsGenericType && typeof(ICollection<>).IsAssignableFrom(propType.GetGenericTypeDefinition()))
            {
                // This condition never passes - always evaluates to false
            }
            else
            {
                string value = (string) info.GetValue(obj, null);
                _sb.AppendLine(key + ": " + value);                    
            }
        }
    }
1个回答

2
这是我在日志中用来识别列表的代码:
if (!propType.IsPrimitive && !propType.IsEnum && propType != typeof(string) && propType.GetInterfaces().Any(x => x.IsGenericType 
           && x.GetGenericTypeDefinition() == typeof(IEnumerable<>)))

编辑:我已经添加了一些额外的检查来过滤掉基本类型(int,bool等),枚举和字符串。


其实我说得太早了。每个属性都通过了这个条件。你有什么想法吗?在这里,字符串被评估为真,这对我来说似乎不正确。 - NealR
将此条件添加到if语句中似乎解决了问题:&& propType.IsGenericType - NealR
1
我的错。在我的代码中,在这个if语句之前,我过滤掉了字符串(和枚举),但是复制代码时我忘记了这一点。顺便说一下,它捕获字符串,因为字符串实现了IEnumerable<char>。 - Jeff Siver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接