使用<Object> <Person> 可变类型将 ICollection 转换为另一种类型 IColcion



我尝试填充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,使用OfTypeCast方法强制转换或选择指定类型的对象。由于您可能无法直接将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

相关内容

  • 没有找到相关文章

最新更新