被对象屏蔽的内部类
本文关键字:内部类 屏蔽 对象 | 更新日期: 2023-09-27 17:52:13
假设类(B)的公共函数有如下返回行:
return (object)(new List<A>{Some elements})
,其中A是一个内部密封类。我无法更改A或b的代码
在B中调用这个函数后,如何找到列表的第一个元素?c#不允许我将列表强制转换回List<A>
,因为A是内部的。
-
仅仅因为你可以阅读源代码或反汇编代码,你不应该依赖于当前的实现,而应该尝试使用公共接口。
-
List<A>
实现了非泛型的IList
,所以如果你真的需要麻烦,你可以转换回IEnumerable
或IList
。
您可以将泛型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>
。另一种选择是使用公共基类