Torna al Thread
//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 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);
//-------------Ho aggiunto questa riga:
//Creo un'istanza del tipo, che uso dopo per ricevere i controlli interni
object instance = yourAssembly.CreateInstance(t.FullName);
//Faccio il controllo di tutti i campi della Form;
//Con GetFields si ottengono i campi pubblici dichiarati
foreach (FieldInfo field in t.GetFields(bf))
{
//Controllo che il campo sia di un tipo che derivi da Control
//-----Questo è stato modificato in modo da includere
//-----anche Control e non solo i derivati:
if (field.FieldType.IsSubclassOf(typeof(Control)) || field.FieldType == typeof(Control))
{
//Aggiungo il nodo come sottonodo del nodo Form:
TreeNode addedCtrl = addedForm.Nodes.Add(field.Name);
//Ottengo le proprietà dal campo specificandone il nome
PropertyInfo textProp = field.FieldType.GetProperty("Text");
//Controllo che la proprietà non sia null; se lo è
//significa che la properietà non esiste (o non è visibile)
if (textProp != null)
{
//ottengo il valore di field assunto nell'istanza instance ottenuta prima
object fieldOfInstance = field.GetValue(instance);
//Controllo che il campo non sia null
if (fieldOfInstance != null)
{
//Quindi ottengo la proprietà dal campo:
string value = textProp.GetValue(fieldOfInstance, null).ToString();
//e l'aggiungo come sottonodo
addedCtrl.Nodes.Add("Text: " + value);
}
}
}
}
}
}