无法在C#中从另一个程序集中转换内部类的列表

时间:2016-12-08 19:55:47

标签: c# reflection casting

我正在使用外部程序集中的一个函数,它返回一个内部类列表的对象,我找不到在我的代码中强制转换它的方法。

外部程序集中的代码:

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,但找不到使用他们建议的方法。

1 个答案:

答案 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对象的字段。