如何强制转换为由于保护级别而无法访问的类型的列表?

How to cast to a list of a type inaccessible due to protection level?

提问人:Cheyenne 提问时间:5/10/2023 更新时间:5/10/2023 访问量:110

问:

我在第三方库中有一个类型,我无法标记为公共,但需要遍历这些对象的列表。我可以使用反射来获取对象,但这个对象是 List。简单地将其转换为 List 似乎不起作用。

Type pType = typeof(PublicType).GetNestedTypes(BindingFlags.NonPublic).First();//gets correct NestedPrivateType, not sure if i can use this to help me cast
object listObj = typeof(PublicType).GetField("_theList", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(publicTypeObj);//this gets the list of objects that are of the nested private type
List<object> theList = (List<object>)listObj;//exception, unable to cast

我将对象强制转换为 List,我希望它能够正确强制转换。

C# 反射 转换 嵌套私有

评论

0赞 Natan 5/10/2023
可以强制转换为 IEnumerable,并使用 foreach 循环循环访问它。listObj
0赞 Cheyenne 5/10/2023
@Natan 它奏效了。问题解决了。谢谢。如果你想回答这个问题,我会把它标记为答案。

答:

1赞 Natan 5/10/2023 #1

举个例子:

object listObj = typeof(PublicType).GetField("_theList", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(publicTypeObj);

若要通过 listObj 枚举,可以将其强制转换为 IEnumerable,并将其与 foreach 循环一起使用:

IEnumerable theEnumerable = (IEnumerable)listObj;
foreach (var item in theEnumerable) { ... }

评论

0赞 Cheyenne 6/20/2023
您知道在这种情况下是否有办法从 IEnumerable 中删除项目吗?
0赞 Natan 10/14/2023
@Cheyenne 如果私有类型为 List<T>,则可以将字段强制转换为 IList,而不是 IEnumerable。然后你就有了可用的方法。void Remove(object? value)void RemoveAt(int index)