被对象屏蔽的内部类

本文关键字:内部类 屏蔽 对象 | 更新日期: 2023-09-27 17:52:13

假设类(B)的公共函数有如下返回行:

return (object)(new List<A>{Some elements})

,其中A是一个内部密封类。我无法更改A或b的代码

在B中调用这个函数后,如何找到列表的第一个元素?c#不允许我将列表强制转换回List<A>,因为A是内部的。

被对象屏蔽的内部类

  1. 仅仅因为你可以阅读源代码或反汇编代码,你不应该依赖于当前的实现,而应该尝试使用公共接口。

  2. List<A>实现了非泛型的IList,所以如果你真的需要麻烦,你可以转换回IEnumerableIList

您可以将泛型List强制转换为非泛型IEnumerable,对其进行迭代,然后使用Object.ToString()获取有关B实例的信息,或者您可以直接返回引用。

Object obj = new List<string> () { "dd", "ee" };
IEnumerable enumerable = obj as IEnumerable;
bool foundSomething = false;
foreach (var thing in enumerable)
{
    if(!foundSomething)
    {
        // Console.Write(thing.ToString()); If you want
        foundSomething = true;
        return thing;
    }
}

也许我误解了这里的问题,但是如果A是密封的,您仍然可以编写扩展方法来迭代或处理列表。

c#中密封类的扩展方法

您可以使用接口协方差转换到IEnumerable<object>,然后使用LINQ的一些扩展方法:

var aItems = (IEnumerable<object>) B.Foo();
Console.WriteLine(aItems.First());

要获取第一个元素而不触及任何元素,可以这样做:

object result = b.MethodThatReturnsList();
object firstEl = ((IList)result)[0];

问题是firstEl变量只能是object,你不能把它转换为A,因为它是不可访问的。但不是很有帮助。

这里是真正的问题:你不能声明返回一些私有/内部类型的公共方法。您将得到这个编译错误。

解决方案是设计一个公共接口,由a实现并返回List<IYourInterface>。另一种选择是使用公共基类