получить сборку по имени класса - PullRequest
13 голосов
/ 07 сентября 2010

Есть ли способ получить сборку, которая содержит класс с именем TestClass?Я просто знаю имя класса, поэтому не могу создать экземпляр этого.И

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

у меня не сработало.

Ответы [ 4 ]

27 голосов
/ 07 сентября 2010
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;
}
19 голосов
/ 07 сентября 2010

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

Тем не менее, может быть лучше работать с именем, указанным в сборке, а не с именем типа.

4 голосов
/ 28 января 2011

Ответ Марка действительно хорош, но так как он был слишком медленным (я часто использую этот метод), я решил пойти другим путем:

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

Вы можете справиться с конфликтом именкак вы хотите, но в этом примере я решил просто игнорировать последующие.

4 голосов
/ 07 сентября 2010

На самом деле знание имени класса достаточно в большинстве сценариев.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, должна быть уже загружена в момент вызова такого кода.

Надеюсь, это поможет.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...