Capisco dalla documentazione di api che ReflectionOnlyGetType restituisce un tipo, molto simile a GetType. La differenza è che con ReflectionOnlyGetType, il tipo viene caricato solo per la reflection, non per l'esecuzione.ReflectionOnlyGetType vs GetType
Allora perché questo lavoro:
Type t = Type.ReflectionOnlyGetType("System.Collections.Generic.List`1[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089", false, false);
ConstructorInfo[] cis = t.GetConstructors();
foreach (ConstructorInfo ci in cis)
{
if (ci.GetParameters().Length == 0)
{
// ! no arg constructor found! let's call it!
Object o = ci.Invoke(new Object[]{});
Console.WriteLine("But wait, it was supposed to be reflection only??");
Console.WriteLine(o.GetType().Name);
List<String> lli = (List<String>)o;
lli.Add("but how can this be?");
Console.WriteLine(lli.Count);
Console.WriteLine("I am doing a lot more than reflection here!");
}
}
La mia domanda è: mi sembra di essere in grado di fare di più che riflettere sui membri di questo tipo. Ho frainteso "esecuzione" quando dicono che il tipo è caricato "solo per riflessione, non per esecuzione"? Oppure ReflectionOnlyGetType restituisce un tipo diverso (non di sola riflessione) se il tipo era già "caricato" e qui è stato caricato in virtù dell'essere in mscorlib? O è qualcosa di completamente diverso?
Naturalmente 'mscorlib' già inseriti per l'esecuzione dal runtime. –
Se si desidera qualcosa che * garantirà * solo per la riflessione, IKVM.Reflection.dll può essere utile; questo è fondamentalmente un loader/parser completamente separato. –