【问题标题】:Cannot cast list of internal class from another assembly in C#无法从 C# 中的另一个程序集转换内部类列表
【发布时间】:2016-12-08 19:55:46
【问题描述】:

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

外部程序集中的代码:

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

【问题讨论】:

  • 你想把它投射到什么地方?
  • InternalClass的同类型,所以我可以访问bi
  • 我一直认为不能将内部类型公开为公共函数的返回值?根据文档,“除非 C 也是公共的,否则不能拥有返回类 C 的公共方法 M”,here - 泛型是否存在漏洞?
  • 找出谁编写了程序集,对他们大喊大叫。但实际上我认为您必须做一些技巧,例如序列化对象,然后将其反序列化为您拥有的类型。
  • 看看这个:stackoverflow.com/questions/38057618/…。我没有尝试过,但这不是 dynamic 关键字会有所帮助的情况吗?你确定bi 是字段,而不是属性?

标签: c# reflection casting


【解决方案1】:

您不应该从公共 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);
    }

上述示例代码将向控制台打印“10”,即从 PublicMethod() 返回的 InternalClass 对象的字节“b”字段的值。

【讨论】:

  • 是的,真正的PublicMethod()实际上返回了一个可用的对象。只是我从头开始写了这个例子,忘记放东西了……
猜你喜欢
  • 2021-11-22
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 2020-07-11
  • 2013-08-19
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
相关资源
最近更新 更多