如何将对象转换为未知types为T的IList <T>

我有一个object[]包含一些值。 我想从中提取信息,但是我无法将数组中的第二个对象( WeakReference )强制转换为数组中的第三个值。

看看我的代码:

 object[] vals = GetValues(); //vals[2] = WeakReference, vals[3] = Type of T, vals[4] = index in the list IList<((Type)vals[3])> list = (IList<((Type)vals[3])>)(((WeakReference)vals[2]).Target); //This line does not even compile, seems like I'm doing something wrong.. object oo = list.ElementAt((int)vals[4]); //Do something with oo... 

任何build议如何我可以将弱引用的目标转换为T = vals [3]的IList接口?

真的很奇怪,你正在把如此多的异类信息打包到一个数组中 。 数组通常用于存储相同类型的元素。 为什么不把数据封装在合适的类型?

但要回答问题 – 在C#4中,您可以使用dynamic

 var target = ((dynamic)vals[2]).Target; if(target != null) { object oo = Enumerable.ElementAt(target, vals[4]); //Do something with oo... } 

(编辑:如果你想最大限度地减少这里的dynamic使用,转换为WeakReference并把动态调用留在最后,这样,类型安全就是“最大化”)。

否则,你可以使用反射:

 object target = ((WeakReference)vals[2]).Target; if (target != null) { object oo = target.GetType() .GetProperty("Item") .GetValue(target, new[] { vals[4] }); //Do something with oo... } 

(编辑:如果索引器可以明确实现,你可能需要使用接口映射。)

已经建议你可以使用dynamic ,但是这听起来像你也应该检查对象是否具有指定的类型。 我也一直把dynamic使用降到最低:

 object target = ((WeakReference) vals[2]).Target; if (target == null) throw new InvalidOperationException("Target cannot be null."); object result = Enumerable.ElementAt((dynamic) target, (int) vals[4]); if (result != null && !((Type) vals[3]).IsAssignableFrom(result.GetType())) throw new InvalidOperationException(string.Format("The retrieved object is a {0}, but the expected type was {1}.", result.GetType(), (Type) vals[3])); return result; 

如果你只是需要一个枚举的对象,在一个给定的索引,这是一个简单的函数:

  public static object GetObjectAt(IEnumerable enumerable, int index) { int i = 0; foreach (object obj in enumerable) { if (i == index) return obj; i++; } throw new IndexOutOfRangeException(); } 

在你的情况下,你会这样做:

  object oo = GetObjectAt((IEnumerable)(WeakReference)vals[2], (int)vals[4]); 

当然,还有更多的选择,看起来更性感(看其他答案),花哨的LINQ查询和酷的C#4动态新潮流的东西:-)但是,一般来说,如果你不需要“T型”代码,你不需要它),你不需要泛型。 这个解决方案实际上支持从1到4的.NET Framework和C#版本。

我觉得你正在努力工作,以便能够使用似乎没有必要的扩展方法。

 object[] vals = GetValues(); var list = ((WeakReference)vals[2]).Target as IList; object oo = null; if (list != null) { oo = list[(int)vals[4]]; }