将字符串转换为IEnumerable <object>

时间:2015-12-22 12:30:18

标签: c# linq generics casting

我有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的]'。

4 个答案:

答案 0 :(得分:7)

IEnumerable<T>界面是协变的,但协方差不适用于值类型。将值类型转换为引用类型更改表示 - 需要对值进行装箱,并返回对装箱值的引用。转换引用类型不会更改表示 - 它仍然是引用相同对象的相同引用。

stringIEnumerable<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>