2010-09-07 67 views
11

有没有办法获得包含名称为TestClass的类的程序集? 我只知道类名,所以我不能创建它的一个实例。和按类名获得程序集

Type objectType = assembly.GetType("TestClass"); 

没有为我工作。

+3

遍历所有引用的程序集将是您唯一的选择,但它也很容易导致重复。但我不完全相信这是你的所有信息,所以你应该试着更明确地说明你的问题的推理。 – 2010-09-07 09:31:05

回答

16

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); 

但是,它可能是更好地与装配合格的名称,而不是类型名称的工作。

+0

无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取更多信息。 – Soonts 2010-11-09 14:29:28

+1

@Soonts - 听起来像是可能在缺失的程序集中存在依赖关系? – 2010-11-09 14:48:54

21
Assembly asm = typeof(TestClass).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; 
} 
3

在大多数情况下,实际上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的应该是已经装载在呼唤这样的代码的时刻。

希望这会有所帮助。 :)

2

马克的回答是非常好的,但由于它太慢了(我经常使用这种方法),我决定用不同的方法去:

private static Dictionary<string, Type> 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<string, Type>(); 
        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]; 
    } 

您可以处理名称冲突你想要的方式,但在这个例子中,我决定忽略后面的那些。