我有propertyValue
这是传递给我的函数的对象。
我可以假设这是某种IEnumerable
,但由于接口合同,我必须将其作为object
而不是直接作为IEnumerable
接受。
当我尝试将我的值转换为IEnumerable<object>
时,我可以获得长度,我得到InvalidCastException
。
var length = ((IEnumerable<object>) propertyValue).Cast<object>().Count();
我得到以下异常:
System.InvalidCastException:无法转换类型的对象 键入'System.String' 'System.Collections.Generic.IEnumerable`1 [System.Object的]'。
答案 0 :(得分:7)
IEnumerable<T>
界面是协变的,但协方差不适用于值类型。将值类型转换为引用类型更改表示 - 需要对值进行装箱,并返回对装箱值的引用。转换引用类型不会更改表示 - 它仍然是引用相同对象的相同引用。
string
是IEnumerable<char>
,因此无法转换为IEnumerable<object>
。
正如其他答案所述,解决方案是转换为非通用IEnumerable
。
var length = ((IEnumerable) propertyValue).Cast<object>().Count();
答案 1 :(得分:3)
我已经通过简单地转换为IEnumerable
而不是转发到IEnumerable<object>
来解决了这个问题。
var length = ((IEnumerable) propertyValue).Cast<object>().Count();
答案 2 :(得分:1)
String实现IEnumerable<char>
接口,您可以将其强制转换为此接口
var length = ((IEnumerable<char>) propertyValue).Count();
对于未知类型的集合,您可以将其强制转换为IEnumerable,然后使用您自己的extension method手动枚举值。
static class EnumerableExtensions
{
public static int Count(this IEnumerable source)
{
int res = 0;
foreach (var item in source)
res++;
return res;
}
}
var collection = propertyValue as IEnumerable;
if(collection != null)
{
var length = collection.Count();
}
使用Cast()方法会导致值类型的装箱,并且可能会对大型集合产生性能问题。
答案 3 :(得分:0)
以下代码应该实际执行您需要的操作
<div ng-repeat="x in scripts">
<script ng-src={{x}}></script>
</div>