Создание типа С# из полного имени

Я пытаюсь получить объект Type из полного имени типа, я делаю следующее:

Assembly asm = Assembly.GetEntryAssembly();  
string toNativeTypeName="any type full name";
Type t = asm.GetType(toNativeTypeName);

Я получаю null, почему?

сборка - это мой исполняемый файл (исполняемый файл .net), а имя типа: System.Xml.XmlNode

Ответ 1

Ну, если это действительно полное имя типа (т.е. включая пространство имен) и оно в этой сборке, то оно должно работать. Не могли бы вы привести пример, где это не так? Поскольку вы используете Assembly.GetType, а не Type.GetType, вы не должны включать имя сборки в имя типа.

Обратите внимание, что имя для универсального типа не является тем, что вы ожидаете от него. Например, вы должны использовать:

assembly.GetType("System.Collections.Generic.List`1");

чтобы получить общий тип списка, затем используйте Type.MakeGenericType для предоставления аргументов типа.

Конечно, это только актуально, если тип является общим. Если это не проблема, я бы дважды проверить, что тип действительно находится в вашей сборке.

EDIT: О, и имейте в виду, что вложенные типы будут "Container + Nested", а не "Container.Nested", если это релевантно...

Ответ 2

См. мое предложение ниже, только пространство для пространства циклов для скорости

private static Type GetBusinessEntityType(string typeName)
{
    Debug.Assert(typeName != null);

    List<System.Reflection.Assembly> assemblies = AppDomain.CurrentDomain.GetAssemblies()
        .Where(a => a.FullName.StartsWith("AF.BusinessEntities")).ToList();

    foreach (var assembly in assemblies)
    {
        Type t = assembly.GetType(typeName, false);
        if (t != null)
            return t;
    }
    throw new ArgumentException(
        "Type " + typeName + " doesn't exist in the current app domain");
}

Вот еще один способ сделать это:

Type t = System.Web.Compilation.BuildManager.GetType("the.type", true, false);

Используйте рефлектор, чтобы увидеть, как это делается, по крайней мере для удовольствия:)

Ответ 3

почему вы определяете сборку для использования типа get!, вам также нужно поставить пространство имен

string toNativeTypeName = "System.Int32";
Type t = Type.GetType(toNativeTypeName );
MessageBox.Show(t.FullName);

Ответ 4

Ваше имя типа, скорее всего, неверно. Если вы создадите ссылку на тип кода, а затем проверьте его свойство Type.FullName, вы увидите, как должно выглядеть имя типа.

Также вы можете попробовать метод Type.GetType и посмотреть, что он возвращает. Может быть, ваш тип не находится в этой сборке вообще?

Изменить: Оказывается, я ошибался в использовании свойства Type.FullName. Если вы используете свойство Type.AssemblyQualifiedName, вы получите полное имя, которое может быть использовано Type.GetType.

Для System.Xml.XmlNode вы получите следующее имя: System.Xml.XmlElement, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Ответ 5

Я наткнулся на эту тему и заметил, что на исходный вопрос не ответил. Я мог ошибаться, но, читая вопрос, я думаю, что авторы намерены иметь возможность просто получить Type from Assembly, на который есть ссылка или часть вашего приложения.

Вот что я сделал, чтобы решить эту проблему.

public static Type GetTypeFromFullName(string fullClassName)
{
    AssemblyPartCollection parts = Deployment.Current.Parts;

    foreach (var part in parts)
    {
        Uri resUri = new Uri(part.Source, UriKind.Relative);
        Stream resStream = Application.GetResourceStream(resUri).Stream;
        Assembly resAssembly = part.Load(resStream);
        Type tryType = resAssembly.GetType(fullClassName, false);
        if (tryType != null)
            return tryType;
    }

    return null;
}