假设类(B)的公共函数具有返回行:
return (object)(new List<A>{Some elements})
其中A是内部密封类。我无法更改A或B的代码。
在B中调用此函数后,如何找到该列表的第一个元素。 C#不允许我将该列表转换回List<A>
,因为A是内部的。
答案 0 :(得分:2)
仅仅因为您可以阅读源代码或反汇编代码,您不应该依赖当前的实现,而应该尝试使用公共接口。
List<A>
实现了非通用IList
,因此如果您真的遇到麻烦,可以转回IEnumerable
或IList
。
答案 1 :(得分:1)
您可以将通用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;
}
}
答案 2 :(得分:1)
也许我在这里误解了这个问题,但是如果A被密封了,你仍然可以编写一个扩展方法来迭代或处理列表。
答案 3 :(得分:1)
您可以使用界面协方差转换为IEnumerable<object>
,然后使用一些LINQ的扩展方法:
var aItems = (IEnumerable<object>) B.Foo();
Console.WriteLine(aItems.First());
答案 4 :(得分:1)
要获得第一个元素而不触及任何内容,您可以执行此操作:
object result = b.MethodThatReturnsList();
object firstEl = ((IList)result)[0];
问题是firstEl
变量只能是object
,并且您无法将其转换为A,因为它无法访问。虽然不是很有帮助。
这是真正的问题:您无法声明返回某些私有/内部类型的公共方法。您将获得this compilation error。
解决方案是设计A将实现并返回List<IYourInterface>
的公共接口。另一种选择是拥有公共基类。