Hej Anders,Anropa klass sas dynamiskt (c sharp)
I C# anropar jag en klass på detta sättet:
dynBox1 boxen1 = new dynBox1();
boxen1.Headline = "Fina grejor";
boxen1.HSize = "1";
boxen1.Message = "Detta är mitt fina meddelande";
boxen1.Url = "/hejsan/hoppsan/";
boxen1.UrlText = "Läs mer här";
PlaceHolder2.Controls.Add(boxen1);
Det fungerar finfint, men ibland vill jag fylla på med data från en databas istället. Min lösning, som inte fungerade, var såhär:
dynBox1 boxen1 = new dynBox1();
while (oReader.Read())
{
boxen1.oReader.GetString(0); = oReader.GetString(1);
}
Självklart går inte detta eftersom boxen1 inte har någon oReader! Men visst borde det gå att göra såhär på något vis. Nyckeln som jag vill komma åt ligger ju i readern. Jag vill inte göra databasanropet innefrån klassen.
Data från databasen ser ut såhär:
NAMN (NYCKEL) / VÄRDE
Headline Fina grejor
HSize 1
Message Detta är mitt fina meddelande
Url /hejsan/hoppsan/
UrlText Läs mer om det här
Tjo och tjing, tack för att hjälp.
/andersSv: Anropa klass sas dynamiskt (c sharp)
Vad du är ute efter är självaste hjärtat i .NET programmering, nämligen <b>Reflection</b> API:t som du hittar i <b>System.Reflection</b>. Följande exempel är från ett <b>WinForm</b> projekt där en <b>Button</b> (button1) och en <b>TextBox</b> (textBox1) har placerats på en <b>form</b>.
private void button1_Click(object sender, System.EventArgs e)
{
Hashtable keyValues =
new Hashtable();
keyValues.Add("Enabled", true);
keyValues.Add("Text", "En liten text");
keyValues.Add("TabIndex", 2);
foreach(string key in keyValues.Keys)
{
PropertyInfo property =
textBox1.GetType().GetProperty((string)key);
property.SetValue(textBox1, keyValues[key], null);
}
}
För att visa hur det fungerar så skapar vi ett <b>HashTable</b> som innehåller namnet på det <b>property</b> som vi vill ändra (detta blir nyckeln) samt det <b>värde</b> som det skall tilldelas. Vad som sen görs är att den loopar igenom alla nycklar, hämtar ut respektivt property med <b>GetProperty</b> metoden och sen sätter det önskade värdet med <b>SetValue</b> metoden.
<b>Obs!</b> Tänk på att det inte finns någon som helst kod för felhantering här, dvs. den hanterar t.ex inte om du försöker hämta ett property som inte finns etc. Det är något som kan vara värt att bygga in om du gör en allmän metod.
Som du ser måste man ange (på två ställen) vilken objekt det handlar om (textBox1) detta kan du skicka med in som en parameter till en metod så du kan återanvända metoden för andra objekt.
Hoppas detta var till hjälp!
//Andreas