Natknąłem się na dziwne zachowanie w moim (ogromnym) projekcie .NET 4. W pewnym momencie w kodzie, mam na myśli w pełni wykwalifikowanego typu, powiedzieć:Dlaczego System.Type.GetType ("Xyz") zwróci wartość null, jeśli istnieje typ (Xyz)?
System.Type type = typeof (Foo.Bar.Xyz);
później, mogę to zrobić:
System.Type type = System.Type.GetType ("Foo.Bar.Xyz");
i wrócę null
. Nie mogę zrozumieć, dlaczego tak się dzieje, ponieważ moje nazwisko jest poprawne, a sprawdziłem je z innymi typami i są one poprawnie rozwiązywane. Ponadto następujące kwerendy LINQ znajdzie typ:
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();
czy są jakieś powody, dla których System.Type.GetType
może nie?
I w końcu musiał uciekać się do tego kawałka kodu zamiast 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;
}
Dziękuję bardzo za odpowiedź. Rzeczywiście, wszystkie inne typy, które rozwiązywałem do tej pory, znajdowały się w tym samym zespole lub w mscorlib, więc wcześniej nie złapałem błędu. –
Dostarczenie "System.Type.GetType" z częściowymi informacjami o montażu działa nawet wtedy, gdy złożenie ma silną nazwę. Sprawdziłem 'System.Type.GetType (" Foo.Bar.Baz, MyCompany.MyAssembly ")' i działa nawet jeśli 'MyCompany.Assembly' ma silną nazwę. –
do wykorzystania w przyszłości, jeśli chcesz użyć odnośnika w podświetleniu kodu (a TY TYLKO będziesz;), użyj podwójnych odskoków, aby rozpocząć i zamknąć cytat :). Zobacz [tutaj] (http://meta.stackexchange.com/q/82718/237379). – Noctis