繁体   English   中英

通过类名获取程序集

[英]get assembly by class name

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

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

没有为我工作。

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

根据问题中的Type objectType ,我假设您实际上是按名称(而不是程序集)按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);

但是,最好使用程序集限定名称而不是类型名称。

实际上,在大多数情况下,对类名的了解就足够了。 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<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];
    }

您可以按所需的方式处理名称冲突,但是在此示例中,我决定仅忽略后续名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM