我正在使用C#.Net 4.7.2
我想通过反射来分析类型。分析的一部分是确定任何种类的属性。例如Collection,List,Array,IEnumerable等。
我认为这很容易,并搜索了实现IEnumerable的类型。 好吧,似乎并不是那么容易。例如,字符串也实现IEnumrable,但不是集合类型。
还有什么可以用来断言该属性是某种集合吗?
说明 集合类型是指可以存储或管理多个成员的任何类型(成员项目的确切数目无关紧要)。也可以将其称为容器类型。例如。集合,列表,数组,字典...
IEnumarable并不是将集合类型与非集合类型分开的好标准。例如,字符串实现IEnumerable,因为它提供了一个char数组。但是String不是集合类型。
我担心的是,以错误的方式对待String之类的类型-作为一个集合。 如果使用字符串,我最终将读取char数组,但是我真的很想读取字符串本身。
如果是真正的收藏类型,例如List<int>
我确实想阅读每个成员。在此示例中,每个整数值。
无需修改值!
答案 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;
}