Scusate se riapro la discussione (se ritente che debba riaprire una thread ditemelo).
Volevo utilizzare la funzione resa funzionante grazie al vostro aiuto, in una pagina ASP.NET.
Ho quindi pensato di eseguire la funzione per l'inizializzazione delle classi statiche nella funzione Page_Load cosìcché all'avvio della pagina web si inizializzano le classi.
Non capisco perchè ma non funziona, nel senso che non appena cerco di caricare la classe tramite Type tipo = Type.GetType(fullName); mi restituisce null, nonostante il nome della classe sia corretto.
private void inizializzaClassiStatiche()
{
//recupero il percorso dell'eseguibile e controllo se è presente il file ini di configuraizone
System.Reflection.Assembly a = System.Reflection.Assembly.GetEntryAssembly();
//string baseDir = System.IO.Path.GetDirectoryName(a.Location);//
string pathConfig = Request.PhysicalApplicationPath + "\\config.ini";
bool esiste = System.IO.File.Exists(@pathConfig);
if (!esiste)
{
//se il file non esiste non procedo con l'inizializzazione
return;
}
//Crea un'istanza del parser
var parser = new IniParser.Parser.IniDataParser();
var dati = parser.Parse(System.IO.File.ReadAllText(@pathConfig));
//Qui personalizza il nome del namespace e dell'assembly in cui le classi si trovano
string assemblyName = "WebSite2";
string namespaceName = "WebSite2";
//Passo in rassegna le sezioni del file ini
//MessageBox.Show("Numero sezioni: " + dati.Sections.Count);
foreach (var sezione in dati.Sections)
{
//Compongo il fully qualified name della classe (cioè namespace.nomeclasse, nomeassembly)
//string fullName = string.Format("{0}.{1}, {2}", namespaceName, sezione.SectionName, assemblyName);
string fullName = string.Format("{0}.{1}", namespaceName, sezione.SectionName);
//Type tipo = Type.GetType(fullName, false, true);
Type tipo = Type.GetType(fullName);
//Type tipo = typeof(WebSite2.Predefiniti_DataBase);
TextBox1.Text += "Fullname: " + fullName + "\r\n";
TextBox1.Text += "Sezione: " + sezione.SectionName + "\r\n";
//Se il tipo è null, vuol dire che la classe non è stata trovata
//Allora la ignoro e passo alla sezione successiva
if (tipo == null)
{
TextBox1.Text += "Tipo null\r\n";
continue;
}
//Se esisteva, ottengo l'elenco delle proprietà statiche di questa classe
var elencoProprietà = tipo.GetProperties(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
var elencoCampi = tipo.GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static);
//Passo in rassegna le chiavi di questa sezione
foreach (var chiave in sezione.Keys)
{
//MessageBox.Show("Chiave: " + chiave.KeyName + " Size elenco proprietà: " + elencoProprietà.Count());
//Ottengo un riferimento a questa proprietà specifica
var proprietà = elencoProprietà.FirstOrDefault(p => p.Name.Equals(chiave.KeyName, StringComparison.InvariantCultureIgnoreCase));
var campi = elencoCampi.FirstOrDefault(p => p.Name.Equals(chiave.KeyName, StringComparison.InvariantCultureIgnoreCase));
//Ignoro questa proprietà se non esisteva
if (proprietà != null || campi == null)
{
//MessageBox.Show("Proprietà null. o campi null ");
continue;
}
//Altrimenti la imposto.
try
{
if (chiave.Value.StartsWith("'") && chiave.Value.EndsWith("'"))
{
//vuol dire che ci sono gli apici iniziali e finali e quindi devo imporre il tipo stringa
string valoreChiave = chiave.Value;
var valore = Convert.ChangeType(valoreChiave.ToString().Substring(1, valoreChiave.IndexOf("'", 1) - 1), TypeCode.String);
campi.SetValue(null, valore);
}
else if (!chiave.Value.Contains("'"))
{ //dato numerico, impongo int come tipo
var valore = Convert.ChangeType(chiave.Value, TypeCode.Int32);
campi.SetValue(null, valore);
}
}
catch (System.ArgumentException ex2)
{
//Questo Evento scatta quando cerco di convertire un tipo che non corrisponde con quello presente nella classe
//se dovesse avvenire, salto al prossimo campo.
continue;
}
catch (FormatException ex2)
{
//Questo Evento scatta quando cerco di convertire un tipo che non corrisponde con quello presente nella classe
//se dovesse avvenire, salto al prossimo campo.
continue;
}
}
}
}
Non capisco quale possa essere il problema. E' corretto inserire come
string assemblyName = "WebSite2";
string namespaceName = "WebSite2"
??
Non sò se può aiutare ma vi allego la situazione dei file nel mio progetto
http://i68.tinypic.com/15xrbit.png