C# 被对象屏蔽的内部类
假设类(B)的公共函数具有返回行: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实例的信息,或
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()