是否可以将Type.GetType与动态加载的程序集一起使用?

说我有这么一点代码:

public static void LoadSomething(Type t) { var t1 = Type.GetType(t.AssemblyQualifiedName); var t2 = t .Assembly .GetTypes() .First(ta => ta.AssemblyQualifiedName == t.AssemblyQualifiedName); } 

会发生什么是t1为且t2 不为空 。 我很困惑,因为如果我这么称呼它……

 LoadSomething(typeof(SomeObject)); 

然后它们都不是null但我实际上做的更像是这样(不是真的,这是大规模简化但它说明了我的观点):

 LoadSomething(Assembly.LoadFile(@"C:\....dll").GetTypes().First()); 

所以问题的第一部分(供我参考)是……

在第二种情况下,由于必须加载程序集并且我找到了它的类型,为什么Type.GetType返回null?

其次(实际解决我的问题)……

当我只将汇编限定名称作为字符串(我之前已经使用Assembly.Load方法加载)时,是否还有其他方法可以加载类型?

当我只将汇编限定名称作为字符串(我之前已经使用Assembly.Load方法加载)时,是否还有其他方法可以加载类型?

是。 有一个允许的GetType重载。 它需要一个“程序集解析器”函数作为参数:

 public static Type LoadSomething(string assemblyQualifiedName) { // This will return null // Just here to test that the simple GetType overload can't return the actual type var t0 = Type.GetType(assemblyQualifiedName); // Throws exception is type was not found return Type.GetType( assemblyQualifiedName, (name) => { // Returns the assembly of the type by enumerating loaded assemblies // in the app domain return AppDomain.CurrentDomain.GetAssemblies().Where(z => z.FullName == name.FullName).FirstOrDefault(); }, null, true); } private static void Main(string[] args) { // Dynamically loads an assembly var assembly = Assembly.LoadFrom(@"C:\...\ClassLibrary1.dll"); // Load the types using its assembly qualified name var loadedType = LoadSomething("ClassLibrary1.Class1, ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); Console.ReadKey(); } 

来自http://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname.aspx

Type.AssemblyQualifiedName属性

类型:System.String类型的程序集限定名称,包括从中加载Type的程序集的名称; 如果当前实例表示generics类型参数则为null。

我认为这是因为方法签名有t作为类型。