我想从未引用的程序集中获取一个类型。我使用this answer来解决我的问题。
现在的问题是,我正在加载包含来自另一个程序集的另一种类型的ObjectList
类型。我是这样做的:
Assembly assembly = Assembly.LoadFrom ("@c:\myAssemblies\myAssembly.Data.DomainObjects.dll");
Type myType = assembly.GetType ("myAssembly.Data.DomainObjects.ObjectList`1[[myAssembly.otherNamespace.myClass, myAssembly.otherNamespace, Version=1.13.73.1082, Culture=neutral, PublicKeyToken=fee00910d6e5f53b]]");
也未引用包含otherNamespace
的程序集,因此GetType
方法返回null
。我现在的问题是:
是否可以获取包含其他类型的未引用程序集的对象列表的类型?或者:如何在ObjectList
?
答案 0 :(得分:0)
我对此并不是百分之百确定,但是当我尝试这个时:
public class Moop<T> {}
我做了:
Type.GetType("UserQuery.Moop`1") //returns null
Type.GetType("UserQuery+Moop`1") //returns the correct type
在Linqpad中
编辑:'+'表示它只是一个嵌套类型 - 所以,这可能不是正确答案。
答案 1 :(得分:0)
好的,这对我来说有点难以测试 - 但我希望我的答案可以转换:
基本上,你需要分两步完成 -这是一个Linqpad脚本:
void Main()
{
//resolve the inner type
var parameterType = Type.GetType("UserQuery+GenericParameter");
//Use the generic type, and generate with the inner parameter type
var genericTypeWithParameter = Type.GetType("UserQuery+Moop`1")
.MakeGenericType(parameterType);
//The resolved type - printed to console
genericTypeWithParameter.Dump();
}
public class Moop <T> { }
public class GenericParameter { }
答案 2 :(得分:0)
如果程序集 myAssembly.otherNamespace.dll 与GAC不在同一目录中或安装在GAC中,则公共语言运行库无法找到它。因此, myAssembly.otherNamespace.dll 未加载到AppDomain,您无法获得所需的类型。
将 myAssembly.Data.DomainObjects.dll 和 myAssembly.otherNamespace.dll 放在可执行文件所在的同一目录中,或将它们安装到GAC。然后使用Load(而不是LoadFrom)确保将它们加载到同一Load Cntext。
如果程序集 myAssembly.Data.DomainObjects.dll 中的元数据包含对程序集 myAssembly.otherNamespace.dll 的引用,则在加载前者时应自动加载后者。否则,您必须在获得所需类型之前加载两个程序集。