C# 被对象屏蔽的内部类

C# 被对象屏蔽的内部类,c#,.net,c#-4.0,reflection,C#,.net,C# 4.0,Reflection,假设类(B)的公共函数具有返回行: return (object)(new List<A>{Some elements}) return(object)(新列表{Some elements}) 其中A是一个内部且密封的类。我不能更改A或B的代码 在B中调用此函数后,如何查找该列表的第一个元素。C#不允许我将该列表强制转换回list,因为A是内部的。您可以将泛型列表强制转换为非泛型IEnumerable,迭代该列表,然后使用Object.ToString()获取关于B实例的信息,或

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

return (object)(new List<A>{Some elements})
return(object)(新列表{Some elements})
其中A是一个内部且密封的类。我不能更改A或B的代码


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

您可以将泛型列表强制转换为非泛型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;

    }
}
objectobj=newlist(){“dd”,“ee”};
IEnumerable enumerable=对象为IEnumerable;
bool foundSomething=false;
foreach(可枚举的变量)
{
如果(!找到某物)
{
//Console.Write(thing.ToString());如果需要
发现某事=真实;
归还物;
}
}

您可以将泛型列表强制转换为非泛型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;

    }
}
objectobj=newlist(){“dd”,“ee”};
IEnumerable enumerable=对象为IEnumerable;
bool foundSomething=false;
foreach(可枚举的变量)
{
如果(!找到某物)
{
//Console.Write(thing.ToString());如果需要
发现某事=真实;
归还物;
}
}

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


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

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

  • List
    实现了非泛型的
    IList
    ,因此如果您真的想找麻烦,您可以回溯到
    IEnumerable
    IList

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

  • List
    实现了非泛型的
    IList
    ,因此如果您真的想找麻烦,您可以回溯到
    IEnumerable
    IList


  • 您可以使用接口协方差强制转换为
    IEnumerable
    ,然后使用LINQ的一些扩展方法:

    var aItems = (IEnumerable<object>) B.Foo();
    Console.WriteLine(aItems.First());
    
    var aItems=(IEnumerable)B.Foo();
    Console.WriteLine(aItems.First());
    
    您可以使用接口协方差强制转换为
    IEnumerable
    ,然后使用LINQ的一些扩展方法:

    var aItems = (IEnumerable<object>) B.Foo();
    Console.WriteLine(aItems.First());
    
    var aItems=(IEnumerable)B.Foo();
    Console.WriteLine(aItems.First());
    
    要在不触碰任何东西的情况下获取第一个元素,可以执行以下操作:

    object result = b.MethodThatReturnsList();
    object firstEl = ((IList)result)[0];
    
    问题是
    firstEl
    变量只能是
    object
    ,您不能将其强制转换为,因为它不可访问。不过也不是很有帮助

    真正的问题是:不能声明返回某些私有/内部类型的公共方法。你会得到的


    解决方案是设计一个公共接口,a将实现并返回
    列表
    。另一种选择是使用公共基类。

    要在不接触任何内容的情况下获取第一个元素,可以执行以下操作:

    object result = b.MethodThatReturnsList();
    object firstEl = ((IList)result)[0];
    
    问题是
    firstEl
    变量只能是
    object
    ,您不能将其强制转换为,因为它不可访问。不过也不是很有帮助

    真正的问题是:不能声明返回某些私有/内部类型的公共方法。你会得到的


    解决方案是设计一个公共接口,a将实现并返回
    列表
    。另一个选项是使用公共基类。

    您的问题是什么?B中返回列表的公共方法的方法签名是什么?@Andrey“在B中调用此函数后,如何找到该列表的第一个元素。”@adv12 public object Foo()你的问题是什么?B中返回列表的公共方法的方法签名是什么?@Andrey“在B中调用此函数后,如何找到该列表的第一个元素。”@adv12 public object Foo()