Creazione di tipo C # dal nome completo

Sto cercando di ottenere un object Type dal tipo nome completo che sto facendo il seguente:

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

Ottengo nulla, perché?

l’assembly è il mio eseguibile (.net eseguibile) e il nome del tipo è: System.Xml.XmlNode

Bene, se questo è veramente il nome completo del tipo (cioè include lo spazio dei nomi) ed è in quell’assembly, allora dovrebbe funzionare. Puoi dare un esempio dove non lo fa? Poiché stai utilizzando Assembly.GetType anziché Type.GetType non devi includere il nome dell’assembly nel nome del tipo.

Si noti che il nome per un tipo generico non è quello che ci si potrebbe aspettare che sia. Ad esempio, useresti:

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

per ottenere il tipo di elenco generico, quindi utilizzare Type.MakeGenericType per fornire argomenti tipo.

Naturalmente, ciò è rilevante solo quando il tipo è generico. Se questo non è il problema, controllerò di nuovo che il tipo sia realmente nell’assembly di ingresso.

EDIT: Oh, e tieni presente che i tipi nidificati saranno “Container + Nested” anziché “Container.Nested” se questo è rilevante …

Vedi il mio suggerimento qui sotto, solo looping business namespace per la velocità

 private static Type GetBusinessEntityType(string typeName) { Debug.Assert(typeName != null); List 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"); } 

Ecco un altro modo per farlo:

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

Usa il riflettore per vedere come è fatto, almeno per divertimento 🙂

perché stai definendo l’assembly da usare get type !, anche tu devi mettere namespace

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

Molto probabilmente il nome del tuo nome è sbagliato. Se crei un riferimento al tipo nel codice e poi controlli la sua proprietà Type.FullName vedrai come dovrebbe apparire il nome del tipo.

Inoltre, puoi provare il metodo Type.GetType e vedere cosa restituisce. Forse il tuo tipo non è affatto in quell’assemblea?

Modifica: si è verificato un errore nell’utilizzo della proprietà Type.FullName. Se si utilizza la proprietà Type.AssemblyQualifiedName, verrà visualizzato il nome completo che può essere utilizzato da Type.GetType.

Per System.Xml.XmlNode si ottiene il seguente nome: System.Xml.XmlElement, System.Xml, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Mi sono imbattuto in questo thread e ho notato che la domanda originale non ha ancora avuto risposta. Potrei sbagliarmi, ma leggendo la domanda penso che gli autori intendessero essere in grado di ottenere semplicemente un Type da un Assembly a cui fa riferimento o parte della tua applicazione.

Ecco cosa ho fatto per risolvere questo problema.

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