c# - 实例化一个内部类并将其转换为给定类型

标签 c# reflection casting internal

跟进 InternalsVisibleTo 。我看过c# Instantiating Internal class with private constructor ,这很有帮助,但我正在尝试将返回的对象转换为内部类型,老实说,我并不是 100% 这是可能的。

我正在尝试通过反射的方式来解决这个问题,但是我很难弄清楚如何使用反射通过私有(private)方法实例化内部类型。我可以提取类型并获取构造函数并创建对象。

如果我希望转换的类型是内部类型,我将如何执行对象的转换?

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对于原始问题。

最佳答案

鉴于您只知道执行时的类型,因此实际上不存在“将对象作为内部类型返回”这样的概念。考虑一下您希望方法签名是什么样子...您无法表达它。

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

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

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

如果您能详细解释为什么您认为自己需要这种能力,我们可以尝试提出替代方案。

关于c# - 实例化一个内部类并将其转换为给定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3513612/

相关文章:

c# - 对 CSV 报告的 URI 访问

c# - 更改安装项目 Visual Studio 的发布者名称

c# - 为什么我在解析 XML 文档时得到空值

java - 从父类(super class)型类获取泛型参数

scala - 在 scala 2.11 中反射(reflect)案例类字段的最佳方式?

casting - D 中的枚举类型安全

c# - 事件在没有任何声明的情况下被触发

java - 调用类构造函数和使用 Class.forName().newInstance 的区别

c++ - 调度线程时进行 void* 指针转换

c# - 如何检查是否存在隐式或显式转换?