实例化内部类并将其转换为给定类型

问题描述:

跟进 InternalsVisibleTo。我已经看过c# Instantiating Internal class with private constructor,这有帮助,但我试图将返回的对象作为内部类型,并且说实话我不是100%,这是可能的。实例化内部类并将其转换为给定类型

我正在尝试反思的路线来解决这个问题,但我有一个艰难的时间试图找出如何使用反射的私有方法实例化一个内部类型。我可以去拉类型并获取构造函数并创建一个对象。

如果我希望投射的类型是内部类型,我将如何预制对象的投射。

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%确定这是可能的,因为在访问修饰符被查看之前,操作顺序发生了反射。

可以这样做,如果是这样,如何?

为了说清楚起见,我想使用实例化的对象进行测试,并且[Assembly:InternalsVisibleTo("")]由于我目前正在解决的错误而无法正常工作。原始问题见here

+1

你玩过InternalsVisibleToAttribute吗? http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx – 2010-08-18 15:18:22

+0

没关系。看到我的问题中的第一个链接。 :p – Terrance 2010-08-18 15:38:12

+1

缺少动态的诡计,您可以为内部类型提取一个公开接口,以公开您测试所需的信息。 – 2010-08-18 16:44:49

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

如果调用代码在一个强类型的方式知道它,你应该做的代码,而不是通用的:

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

...但如果调用代码知道这件事,这是对它没有帮助。

如果你能解释更多关于你为什么想要这个能力的原因,我们可以尝试建议一些替代品。

+0

这绝对会让我感到头疼,因为它无法休息。 “Skeet”在我的一个问题的答案列表中出现,我感到非常荣幸。 Woot,谢谢澄清。 – Terrance 2010-08-18 15:31:46

我可以使用Reflection.Emit的创建基于该类型

不是一个真正的新类:使用Reflection.Emit的生成代码遵循相同的规则作为自己的C#。您不能用它绕过internal保护。

我见过的例子访问个人的方法和属性

那就是你需要做的:使用反射来查找和调用单独的方法和属性。

几个选择:

  • 修改内部类实现一些接口,使该接口公开。正常地调用接口上的方法。
  • 获取[InternalsVisibleTo]工作。 这是正确的路要走。
+0

只是修正了[InternalsVisibleTo]。奇怪的怪胎错误。感谢您的额外智慧。 – Terrance 2010-08-18 15:25:05

这是不是一个真正的直接回答你的问题,但你会发现这个有用:

ExposedObject

如果您没有访问内部类型,也没有该类型实施您认为足以与之互动的任何公共界面,但您事先知道该类型成员的姓名和签名,这可能是您的最佳选择。

+0

哎呀,那真是太棒了。雅为动态。幸运的是,我不再需要它了,但它将出现在我的工具箱中,用于处理其他奇怪的情况,特别是如果我仅引用一对内部或私人类进行测试。 – Terrance 2010-08-18 15:28:14