我尝试填充ICollection<Person>
或ICollection<T>
的属性类型。我给List<object>
或ICollection<object>
的objectList类型,无论如何,我不能通过对象列表设置ICollection<Person>
的值属性类型
if (property.PropertyType.IsGenericType &&
property.PropertyType.GetGenericTypeDefinition()
== typeof(ICollection<>))
{
Type itemType = property.PropertyType.GetGenericArguments()[0];
ICollection<object> objectList =GetObjectList();
property.SetValue(item, objectList);
}
谢谢。
您不能将ICollection<Person>
设置为ICollection<object>
,因为iccollection不是逆变的(在泛型参数声明中没有in
关键字)。
您将显式地将object
的集合强制转换为Person
if (property.PropertyType.IsGenericType &&
property.PropertyType.GetGenericTypeDefinition()
== typeof(ICollection<>))
{
Type itemType = property.PropertyType.GetGenericArguments()[0];
ICollection<Person> objectList =GetObjectList().Cast<ICollection<Person>>();
property.SetValue(item, objectList);
}
您的解决方案是LINQ,使用OfType
或Cast
方法强制转换或选择指定类型的对象。由于您可能无法直接将ICollection<object>
转换为ICollection<Person>
,但您有一个解决方案来实现相同的。
ICollection<Person> objectList = GetObjectList().OfType<Person>().ToList();
或
ICollection<Person> objectList = GetObjectList().Cast<Person>().ToList();
这段代码将返回给你一个List<Person>
,因为List<T>
实现了ICollection<T>
在这里意味着ICollection<Person>
,所以结果将可分配给你的属性
Cast()比OfType()执行得更快,因为在OfType中涉及到额外的类型检查。在Linq
中何时使用Cast()和Oftype() object objectList = GetObjectList();
property.SetValue(item, Convert.ChangeType(objectList, property.PropertyType));
如果类型兼容,将转换值。这个示例不要求您知道底层类型。阅读更多关于ChangeType http://msdn.microsoft.com/en-us/library/dtb69x08.aspx