Создание типа С# из полного имени
Я пытаюсь получить объект 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;
}