由对象

时间:2016-06-27 15:17:44

标签: c# .net c#-4.0 reflection

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

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

其中A是内部密封类。我无法更改A或B的代码。

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

5 个答案:

答案 0 :(得分:2)

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

  2. List<A>实现了非通用IList,因此如果您真的遇到麻烦,可以转回IEnumerableIList

答案 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被密封了,你仍然可以编写一个扩展方法来迭代或处理列表。

Extension methods for sealed class in c#

答案 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>的公共接口。另一种选择是拥有公共基类。