实例化一个Internal类并将其作为给定类型进行转换

跟进InternalsVisibleTo 。 我已经看过c#Instantiating内部类与私有构造函数 ,这有帮助,但我试图将返回的对象作为内部类型,并且说实话,我不是100%,这是可能的。

我正在尝试使用Reflection的路径来解决这个问题,但是我正在努力弄清楚如何使用reflection来实现私有方法的内部类型。 我可以去拉类型并获取构造函数并创建一个对象。

如果我想要转换的类型是内部类型,我将如何预先形成对象的强制转换。

public object InitPrivateCoreObjects(string Type) { Assembly Core = Assembly.Load("Stuff.Core, Version=0.3.3881.21340, Culture=neutral, PublicKeyToken=4fe470e63e2d354e"); Type TypeToReflect = Core.GetType("Stuff.Core.AssemblyWithIdentifer"); object o = Activator.CreateInstance(TypeToReflect); MethodInfo mi = TypeToReflect.GetMethod("AssemblyWithIdentifer"); object newObject = mi.Invoke(o,null); //alternatively //ConstructorInfo ctor = TypeToReflect.GetConstructor(new Type[]{TypeToReflect.GetType()}); //ctor.Invoke(newObject, null); return newObject; } 

我可以得到内部类的类型,
我可以调用构造函数并实例化该类型的对象。 但是,由于我无法访问内部类型,因此无法对其进行转换并从中进行操作。

我知道我可以使用Reflection.Emit来创建一个基于该类型的新类,但是如果我要走那条路,那么我也可以将我试图访问的项目的全部内容复制到我的测试项目中。 这将是非常浪费和毫无意义的,并且需要我从其他项目中投入一些东西并造成混乱,而这绝对不是我此时想去的路线。

我已经看到访问单个方法和属性的示例,但没有实例化整个类。 我不是100%确定它是可能的,因为在操作顺序中reflection发生在查看访问修饰符之前。

可以这样做,如果是这样,怎么办?

为了求情,我想使用实例化的对象进行测试,而[Assembly:InternalsVisibleTo("")]由于我目前正在解决的bug而无法正常工作。 在这里查看原始问题。

鉴于您只知道执行时的类型,实际上没有“将对象作为内部类型返回”这样的概念。 想想你希望方法签名看起来像什么……你无法表达它。

如果调用代码以强类型方式知道它,则应该使代码通用:

 public T InitPrivateCoreObjects() { Type type = typeof(T); ... return (T) newObject; } 

…但是如果调用代码知道它,那对它没有帮助。

如果你能解释一下为什么你认为你想要这种能力,我们可以尝试建议替代品。

我可以使用Reflection.Emit基于该类型创建一个新类

不是真的:使用Reflection.Emit生成的代码遵循与您自己的C#相同的规则。 您无法使用它来绕过internal保护。

我见过访问单个方法和属性的示例

这就是你需要做的事情:使用reflection来查找并调用各个方法和属性。

几种选择:

  • 修改内部类以实现某个接口,并使该接口公开。 正常调用接口上的方法。
  • [InternalsVisibleTo]工作。 这是正确的方法。

这不是您问题的直接答案,但您可能会觉得这很有用:

ExposedObject

如果您无法访问内部类型,那么该类型也不会实现您认为足以与其进行交互的任何公共接口, 您事先知道该类型成员的名称和签名,这可能是您的最佳选择。