跟进 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/