C#将对象强制转换为IEnumerable<;T>;当可枚举类型为值类型(例如enum)时,使用Linq扩展

C#将对象强制转换为IEnumerable<;T>;当可枚举类型为值类型(例如enum)时,使用Linq扩展,c#,linq,collections,casting,C#,Linq,Collections,Casting,如果我知道对象值的类型是可枚举类型,如何强制转换为IEnumerable,以便在接收对象值的方法中使用Linq扩展方法(Count(),Distinct()) 对IEnumerable的简单强制转换适用于引用类型,但不适用于枚举等值类型,例如: StringComparison[] myArray = new StringComparison[] { StringComparison.OrdinalIgnoreCase, StringComparison.Ordinal }; void

如果我知道对象值的类型是可枚举类型,如何强制转换为
IEnumerable
,以便在接收对象值的方法中使用Linq扩展方法(
Count()
Distinct()

IEnumerable
的简单强制转换适用于引用类型,但不适用于枚举等值类型,例如:

StringComparison[] myArray = new StringComparison[] {
  StringComparison.OrdinalIgnoreCase,
  StringComparison.Ordinal
};

void DoSomething(object value) {
    IEnumerable<object> items = (IEnumerable<object>) value;

    // use the enumerable with System.Linq.Enumerable extensions
    // items.Count()
    // items.Distinct()
}

DoSomething(myArray);
StringComparison[]myArray=新建StringComparison[]{
StringComparison.OrdinalIgnoreCase,
顺序比较
};
void DoSomething(对象值){
IEnumerable项=(IEnumerable)值;
//将可枚举文件与System.Linq.enumerable扩展一起使用
//items.Count()
//项目.不同()
}
剂量测定法(myArray);
使用枚举时,强制转换会将System.InvalidCastException:“无法将类型为”System.StringComparison[]”的对象强制转换为类型为“System.Collections.Generic.IEnumerable^1[System.object]”。

其他答案(例如)建议使用非泛型的
IEnumerable
进行转换。不幸的是,我想要的扩展方法(
Count()
Distinct()
)不能用于非泛型的
IEnumerable

背景:上述示例已简化。我的实际用例是,我编写了一个自定义的
System.ComponentModel.DataAnnotations.ValidationAttribute
,它对可枚举属性执行检查
ValidationAttribute
有一个方法
IsValid(对象值)
,一个枚举值数组被传递到该方法,我需要迭代该属性,但由于这个原因它失败了


谢谢

数组
StringComparison[]
实现
IEnumerable
IEnumerable
接口,但不实现
IEnumerable

不幸的是,您不能使用通用协方差将类型为
IEnumerable
的对象分配给类型为
IEnumerable
的变量,因为
StringComparison
不是引用类型:您不能像访问对象一样访问
StringComparison[]
的任何旧元素,因为它没有普通的对象头等等

您可以做的是:


数组
StringComparison[]
实现
IEnumerable
IEnumerable
接口,但不实现
IEnumerable

不幸的是,您不能使用通用协方差将类型为
IEnumerable
的对象分配给类型为
IEnumerable
的变量,因为
StringComparison
不是引用类型:您不能像访问对象一样访问
StringComparison[]
的任何旧元素,因为它没有普通的对象头等等

您可以做的是:

IEnumerable<object> items = ((IEnumerable)value).Cast<object>();
List<object> items = ((IEnumerable)value).Cast<object>().ToList();