【发布时间】:2015-12-11 19:01:03
【问题描述】:
此问题已完全编辑。要查看原始版本,请查看编辑历史记录
我想我应该稍微解释一下我的情况和问题的背景。
我正在检查使用自定义属性注释的属性的类型。然后我得到该属性的值,但作为object:
IEnumerable<object> propertiesValues = myType.GetProperties().Where(p => p.GetCustomAttributes(typeof(MyCustomAttribute)) != null);
一旦我有了这些值,我想在它们上调用我的方法Map,这会根据它们的类型将它们转换为不同的对象。这是因为我的数据库 API 需要这样做。
foreach(object value in propertiesValues)
{
object mapped = Map(value);
// ...
}
我需要将所有IEnumerable<NumberType> 值转换为IEnumerable<string>。所以我的第一个方法是:
public static object Map(object value)
{
if(value is IEnumerable<short> || value is IEnumerable<int> || ....)
return ((IEnumerable<object>) value).Cast<string>();
}
但是,这会引发运行时异常,例如,我无法将 IEnumerable<int> 转换为 IEnumerable<object>。
【问题讨论】:
-
我认为这是错误的
return ((IEnumerable<object>) value).Cast<string>();应该不是return (IEnumerable<object>) value.Cast<string>(); -
@Tomaltach
value没有Cast方法(它只是一个object)所以我需要将它转换为IEnumerable<> -
IEnumerable<int> i = new List<int> { 1, 2, 3 }.AsEnumerable();然后IEnumerable<object> o = i.Cast<object>().AsEnumerable();有效。这是你要找的吗? -
@RezaAghaei 看来我无法解释我的问题。我只想将伪装成
object的IEnumerable<?>投射到IEnumerable<object>。这可能吗? -
@MatiasCicero:你的庆祝还为时过早。您根本不能使用 Cast 序列运算符进行这样的表示更改转换。您不能将 short 转换为字符串,因此您也不能将
Cast和IE<short>转换为IE<string>。
标签: c# .net linq generics covariance