C#通过使用反射仅识别类似数据类型的集合

时间:2018-11-28 10:31:51

标签: c# reflection system.reflection

我正在使用C#.Net 4.7.2

我想通过反射来分析类型。分析的一部分是确定任何种类的属性。例如Collection,List,Array,IEnumerable等。

我认为这很容易,并搜索了实现IEnumerable的类型。 好吧,似乎并不是那么容易。例如,字符串也实现IEnumrable,但不是集合类型。

还有什么可以用来断言该属性是某种集合吗?

说明 集合类型是指可以存储或管理多个成员的任何类型(成员项目的确切数目无关紧要)。也可以将其称为容器类型。例如。集合,列表,数组,字典...

IEnumarable并不是将集合类型与非集合类型分开的好标准。例如,字符串实现IEnumerable,因为它提供了一个char数组。但是String不是集合类型。

我担心的是,以错误的方式对待String之类的类型-作为一个集合。 如果使用字符串,我最终将读取char数组,但是我真的很想读取字符串本身。

如果是真正的收藏类型,例如List<int>我确实想阅读每个成员。在此示例中,每个整数值。

无需修改值!

1 个答案:

答案 0 :(得分:1)

您必须检查IList和IDictonary而不是IEnumerable 这是我的框架中的示例:

    public static bool IsContainerType( Type type )
    {
        TypeInfo typeInfo = type.GetTypeInfo();

        if ( typeInfo.IsArray == true )
            return true;

        if ( typeof( System.Collections.IList ).IsAssignableFrom( type ) == true )
            return true;

        if ( typeof( System.Collections.IDictionary ).IsAssignableFrom( type ) == true )
            return true;

        return false;
    }