一尘不染

如何从外部程序集访问内部类?

c#

有一个我无法修改的程序集(供应商提供),该程序集的方法返回 对象 类型,但实际上是内部类型。

如何从程序集中访问对象的字段和/或方法?

请记住,我无法修改供应商提供的程序集。

本质上,这就是我所拥有的:

来自供应商:

internal class InternalClass
  public string test;
end class

public class Vendor
  private InternalClass _internal;
  public object Tag {get{return _internal;}}
end class

从我的装配中使用供应商装配。

public class MyClass
{
  public void AccessTest()
  {
    Vendor vendor = new Vendor();
    object value = vendor.Tag;
    // Here I want to access InternalClass.test
  }
}

阅读 227

收藏
2020-05-19

共1个答案

一尘不染

如果无法访问类型(并且没有“ InternalsVisibleTo”等),则必须使用反射。但是,一个更好的问题是: 应该
你可以访问这些数据?它不是公共类型合同的一部分…在我看来,它打算被视为不透明的对象(出于其目的,而不是您的目的)。

您已经将其描述为公共实例字段;通过反射得到这个:

object obj = ...
string value = (string)obj.GetType().GetField("test").GetValue(obj);

如果它实际上是一个属性(不是字段):

string value = (string)obj.GetType().GetProperty("test").GetValue(obj,null);

如果它是非公开的,则需要使用/ 的BindingFlags重载。GetField``GetProperty

除了重要的一点
:小心这样的反射;实现可能会在下一个版本中更改(破坏您的代码),或者可能被混淆(破坏您的代码),或者您可能没有足够的“信任”(破坏您的代码)。您发现图案了吗?

2020-05-19