我正在使用外部程序集中的一个函数,它返回一个内部类列表的对象,我找不到在我的代码中强制转换它的方法。
外部程序集中的代码:
namespace AssemblyNamespace
{
internal class InternalClass
{
protected internal byte b;
protected internal int i;
}
public class PublicClass
{
public object PublicMethod()
{
return new List<InternalClass>();
}
}
}
我的代码:
using AssemblyNamespace;
static void Main()
{
PublicClass P = new PublicClass();
object obj = new object();
obj = P.PublicMethod();
// Is it possible to cast obj?
}
是否可以通过反射或其他方式投射obj?我看了一下问题C# - How to access internal class from external assembly,但找不到使用他们建议的方法。
答案 0 :(得分:3)
您不应该从公共API公开内部类型...并且您从PublicMethod()返回一个空列表,因此没有要访问的InternalClass对象。
但是如果PublicMethod()实际返回一个InternalClass对象......:
public class PublicClass
{
public object PublicMethod()
{
return new List<InternalClass>() { new InternalClass() { b = 10 } };
}
}
...您可以通过以下反射访问其字段:
static void Main()
{
PublicClass P = new PublicClass();
System.Collections.IList list = P.PublicMethod() as System.Collections.IList;
object internalObject = list[0];
FieldInfo fi = internalObject.GetType().GetField("b", BindingFlags.NonPublic | BindingFlags.Instance);
byte b = (byte)fi.GetValue(internalObject);
Console.WriteLine(b);
}
上面的示例代码将打印&#34; 10&#34;,即字节的值&#34; b&#34;从PublicMethod()返回到控制台的InternalClass对象的字段。