【发布时间】:2017-11-15 10:02:11
【问题描述】:
我创建了一个动态创建类型的对象,并尝试调用运行时加载的函数。
invoke 调用异常: {System.ArgumentException:“UserClasses.re_Constituent”类型的对象无法转换为“UserClasses.re_Constituent”类型。}
(是的,这两个类是相同的)
类的代码,以及被调用函数的代码是根据https://stackoverflow.com/a/3024112/432976之前生成和编译的
有人知道错误的来源吗?
magicValue Invoke() 处的以下代码异常
namespace myTest
{
internal class Program
{
Main(){
//pseudoCode
BuildTypes();
{Type myType,MethodInfo myMethod} = factory.getType("re_Constituent");
//actual code that exceptions
Node result = (Node) JSON.Deserialize(textstream,myType);
object magicValue = myMethodInfo.Invoke(null,new object[]{result});
}
}
namespace UserClasses
{
public abstract class Node
{}
}
在调用代码行暂停时检查显示:
myMethodInfo 是: {System.Collections.Generic.List`1[UserClasses.Node] ConvertToCore(UserClasses.re_Constituent)}
methodInfo 期望的参数类型是: "UserClasses.re_Constituent, dynamicGen_reApi_3, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
传递给 JSON 反序列化器 (Jil) 的类型被列为: "UserClasses.re_Constituent, dynamicGen_reApi_3, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
result.GetType().AssemblyQualifiedName: "UserClasses.re_Constituent, dynamicGen_reApi_3, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
re_Constituent 在单独的动态加载的 dll 中定义。
namespace UserClasses
{
public class re_Constituent : Node
{
public string id;
... other fields
}
}
函数的代码在另一个运行时加载的 dll 中找到:
namespace UserClasses
{
public static class MyExtensions
{
public static List<Node> ConvertToCore(this re_Constituent node)
{
return new List<Node>()
{
new Node(); // actual code is more complex here
};
}
}
}
我注意到我的动态生成/加载有一些有趣的地方,通过迭代所有加载的程序集中的所有类,这表明内存中有 2 个已构建程序集的副本:
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
if(!assembly.GetName().Name.StartsWith("System"))
foreach (Type type in assembly.GetTypes())
{
if(type.FullName.Name.StartsWith("System"))
Console.WriteLine(type+":"+assembly.GetName().Name);
}
}
【问题讨论】:
标签: c# reflection