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

时间:2010-08-18 15:13:25

标签: c# reflection casting internal

跟进 InternalsVisibleTo。我看过c# Instantiating Internal class with private constructor,这有帮助,但我试图将返回的对象作为内部类型进行转换,老实说,我不是百分之百那可能。

我正在尝试使用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%确定它是可能的,因为在操作顺序中反射发生在查看访问修饰符之前。

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

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

3 个答案:

答案 0 :(得分:1)

  

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

创建一个新类

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

  

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

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

有两种选择:

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

答案 1 :(得分:1)

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

ExposedObject

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

答案 2 :(得分:0)

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

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

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

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

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