按类名获取程序集
有没有办法让包含名为TestClass
的类的程序集? 我只知道类名,所以我无法创建它的实例。 和
Type objectType = assembly.GetType("TestClass");
对我不起作用。
从问题中的Type objectType
,我假设您实际上是按名称输入类型(而不是程序集); 所以假设加载程序集并且类型名称是唯一的,LINQ可能会有所帮助:
Type objectType = (from asm in AppDomain.CurrentDomain.GetAssemblies() from type in asm.GetTypes() where type.IsClass && type.Name == "TestClass" select type).Single(); object obj = Activator.CreateInstance(objectType);
但是,使用程序集限定名称而不是类型名称可能更好。
Assembly asm = typeof(TestClass).Assembly;
只要引用它就会给你assembly。 否则,您必须使用完全限定名称:
Assembly asm = null; Type type = Type.GetType("TestNamespace.TestClass, ConsoleApplication1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); if (type != null) { asm = type.Assembly; }
实际上,在大多数情况下,知道classname就足够了。 MSDN说 – 如果类型在当前正在执行的程序集或Mscorlib.dll中,则提供由其名称空间限定的类型名称就足够了。
Type neededType = Type.GetType("TestClass"); //or typeof(TestClass) Assembly a = neededType.Assembly;
如果您不知道包含类型的程序集(虽然我无法想象为什么) –
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); Asssembly result = assemblies.FirstOrDefault(a=>a.GetType("TestClass",false)!=null);
唯一的限制 – 包含TestClass的程序集应该在调用此类代码时已经加载。
希望这会有所帮助。 🙂
Marc的答案非常好,但由于它太慢(我经常使用这种方法),我决定采用不同的方法:
private static Dictionary types; private static readonly object GeneralLock = new object(); public static Type FindType(string typeName) { if (types == null) { lock (GeneralLock) { if (types == null) { types = new Dictionary(); var appAssemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (var appAssembly in appAssemblies) { foreach (var type in appAssembly.GetTypes()) if (!types.ContainsKey(type.Name)) types.Add(type.Name, type); } } } } return types[typeName]; }
你可以按照你想要的方式处理名称冲突,但在这个例子中我决定忽略后续的冲突。