Mi sono imbattuto in uno strano comportamento nel mio (enorme) progetto .NET 4. Ad un certo punto del codice, mi riferisco a un tipo completo, dire:Perché System.Type.GetType ("Xyz") restituisce null se typeof (Xyz) esiste?
System.Type type = typeof (Foo.Bar.Xyz);
più tardi, faccio questo:
System.Type type = System.Type.GetType ("Foo.Bar.Xyz");
e torno null
. Non riesco a capire perché questo sta accadendo, perché il mio nome tipo è corretto, e ho controllato con altri tipi e vengono risolti correttamente. Inoltre, la seguente query LINQ trova il tipo:
var types = from assembly in System.AppDomain.CurrentDomain.GetAssemblies()
from assemblyType in assembly.GetTypes()
where assemblyType.FullName == typeName
select assemblyType;
System.Type type = types.FirstOrDefault();
Esistono motivi per cui System.Type.GetType
potrebbe fallire?
Ho finalmente dovuto ricorrere a questo pezzo di codice, invece di GetType
:
System.Type MyGetType(string typeName)
{
System.Type type = System.Type.GetType (typeName);
if (type == null)
{
var types = from assembly in System.AppDomain.CurrentDomain.GetAssemblies()
from assemblyType in assembly.GetTypes()
where assemblyType.FullName == typeName
select assemblyType;
type = types.FirstOrDefault();
}
return type;
}
Grazie mille per la risposta. In effetti, tutti gli altri tipi che stavo risolvendo fino ad ora si trovavano nello stesso assembly o in mscorlib, quindi non ho catturato l'errore prima. –
Fornire 'System.Type.GetType' con informazioni di assemblaggio parziali funziona anche se l'assembly ha un nome sicuro. Ho controllato 'System.Type.GetType (" Foo.Bar.Baz, MyCompany.MyAssembly ")' e funziona anche se 'MyCompany.Assembly' ha un nome forte. –
per riferimento futuro, se si desidera utilizzare il backtick in un evidenziatore del codice (e probabilmente lo si farà;), utilizzare double backtick per iniziare e chiudere la citazione :). Vedi [qui] (http://meta.stackexchange.com/q/82718/237379). – Noctis