将字符串转换为IEnumerable <object>

Jam*_*ger 5 c# linq generics casting

我有propertyValue一个传递给我的函数的对象.

我可以假设这是IEnumerable某种类型,但是由于接口契约,我必须接受它作为一个object而不是直接作为一个IEnumerable.

当我试图将我的价值投射到一个IEnumerable<object>,以便我可以得到长度,我得到一个InvalidCastException.

var length = ((IEnumerable<object>) propertyValue).Cast<object>().Count();
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

System.InvalidCastException:无法将类型为'System.String'的对象强制转换为'System.Collections.Generic.IEnumerable`1 [System.Object]'.

Jak*_*rtz 7

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

string是一个IEnumerable<char>,所以它不能被铸造IEnumerable<object>.

正如其他答案中所提到的,解决方案是转换为非泛型IEnumerable.

var length = ((IEnumerable) propertyValue).Cast<object>().Count();
Run Code Online (Sandbox Code Playgroud)


Jam*_*ger 3

IEnumerable我通过简单地转换为而不是转换为解决了这个问题IEnumerable<object>

var length = ((IEnumerable) propertyValue).Cast<object>().Count();
Run Code Online (Sandbox Code Playgroud)