Per trovare i controlli devi elencare tutti i campi dichiarati nella Form e quindi controllare se il tipo del campo deriva da Control. Estendo l'esempio precedente aggiungendo i controlli come sottonodi del nodo della Form:
//Questa variabile conterrà l'assebmbly caricato dal file
System.Reflection.Assembly yourAssembly;
try
{
//Prova a caricare l'assembly da un file
yourAssembly = Assembly.LoadFile("Nome del file");
}
catch (Exception ex)
{
//Se viene generato un errore mostra un messaggio d'avviso
//Con nome dell'errore e messaggio e interrompe la ricerca
MessageBox.Show(string.Format(
"Si è verificato il seguente errore:\r\n{0}:\r\n{1}",
//Il nome dell'eccezione e il messaggio
ex.GetType().Name, ex.Message));
return;
}
//Cancello i nodi della TreeView
tuaTreeView.Nodes.Clear();
//Con GetTypes si ottengono tutti i tipi dichiarati nell'assembly
foreach (Type t in yourAssembly.GetTypes())
{
//Con IsSubclassOf si ottiene un valore booleano
//Che indica se la classe deriva (direttamente o non)
//Dal tipo specificato
if (t.IsSubclassOf(typeof(Form)))
{
//Se sì aggiungo il nome della classe all'elenco dei nodi
//E memorizzo il nodo per poter aggiungere
//eventuali sottonodi
TreeNode addedForm = tuaTreeView.Nodes.Add(t.Name);
//Faccio il controllo di tutti i campi della Form;
//Con GetFields si ottengono i campi pubblici dichiarati
foreach (FieldInfo field in t.GetFields())
{
//Controllo che il campo sia di un tipo che derivi da Control
if (field.FieldType.IsSubclassOf(typeof(Control)))
{
//Aggiungo il nodo come sottonodo del nodo Form:
addedForm.Nodes.Add(field.Name);
}
}
}
}
Se invece che ottenere solo i controlli pubblici vuoi ottenere ad esempio anche quelli privati devi passare al metodo GetFields una combinazione di BindingFlags, in questo caso la seguente:
BindingFlags bf =
BindingFlags.Public | //Include i membri pubblici
BindingFlags.NonPublic | //Include i membri non pubblici
BindingFlags.Instance; //Include i membri d'istanza
Luca