Hej! Är det bara Text du vill komma åt? Hej Patrik! Så här skulle du väl kunna göra, så länge det är properties Tack Johan, en generell och bra lösning! Jonas, Tack Andreas! Jonas,Casta till variabel typ...
Lite kryptisk rubrik tror jag. :-)
Jag har en hjälpklass som används av flera olika ascx-sidor. Sidorna presenterar delvis samma data, på ett likartat sätt, men m h a olika typer av kontroller (t.ex. labels på en sida, textboxar på en annan).
Vid flera tillfällen ska kontroller på sidorna manipuleras m h a hjälpklassen, vilket kräver att jag söker rätt på och castar kontrollen ifråga.
Vad jag gör nu är därför ungefär såhär:
if(myWebPage.FindControl("myControl").GetType().Name == "TextBox")
{
((TextBox)myWebPage.FindControl("myControl").GetType()
}
elseif(myWebPage.FindControl("myControl").GetType().Name == "Label")
{
((Label)myWebPage.FindControl("myControl")).Text = myString;
}
Detta funkar, men det skulle ju vara snyggare om jag inte behövde duplicera koden för varje kontrolltyp.
Ungefär såhär skulle jag alltså vilja göra:
System.Type myType = myWebPage.FindControl("myControl").GetType();
((myType)myWebPage.FindControl("myControl")).Text = myString;
Men det går icke. Kompilatorn kan förvisso i det läget inte veta huruvida det kommer att finnas en Text-property eller inte, men det vet ju jag... Det den klagar på är hursomhelst att typen myType inte finns.
Frågan är, finns det sätt att göra detta? Känns ju som att reflection skulle kunna vara lösningen, men jag är rätt lost i det ämnet.
Några idéer?
MVH
/JonasSv: Casta till variabel typ...
isf kan du casta till ControlSv: Casta till variabel typ...
Tack för svaret, men tyvärr funkar det inte.
Jag har ett antal andra manipulationer (av styles bl.a.) som jag löser på det sättet.
Men: 'System.Web.UI.Control' does not contain a definition for 'Text'...
MVH
/JonasSv: Casta till variabel typ...
private void Page_Load(object sender, System.EventArgs e)
{
FindControlAndSetProperty("TextBox1","Text","Hej",new object[0]);
}
private void FindControlAndSetProperty(string myControl, string property, object val, object[] index)
{
Control ctrl=this.FindControl(myControl);
PropertyInfo propInfo = ctrl.GetType().GetProperty(property);
propInfo.SetValue(ctrl,val,index);
}
Sv: Casta till variabel typ...
Jag måste verkligen sätta mig in mer i System.Reflection.
Några tips på litteratur/online-artiklar?
MVH
/JonasSv: Casta till variabel typ...
Dokumentationen på Reflection är faktiskt väldigt bra =) Finns online på MSDN om du inte har den installerad.Sv: Casta till variabel typ...
Jo, jag har MSDN installerat och visst är den dokumentationen bra, som referens betraktat. Men jag är mer ute efter tutorials eller diskusioner som ger en kontext. Nu fanns det ju ett par reflection-exempel i dokumentationen och de ska jag förstås kolla upp.
Jag fick också tips, utanför Pellesoft, om den här ganska ingående genomgången:
http://www.ondotnet.com/lpt/a/1040
Det är ett fritt exempelkapitel från O'Reilly-boken Programming C#. Kan nog vara nåt för den som liksom jag känner mig grön i ämnet.
Det + MS-dokumentationen lär räcka för mig ett tag...
Tack igen allihop, bra svar som vanligt!
MVH
/JonasSv: Casta till variabel typ...
MSDN dokumentationen och en hälsosamt nyfikenhet kommer man långt på =) Skummade igenom länken och den såg bra ut. Mitt tips är helt enkelt att ta en av dina gamla klasser som du skrivit och kopiera in den i ett nytt projekt. I det projektet använder du dig av reflection för att gå igenom klassen och hämta ut olika typer av information.
Och som vanligt så är det bara att posta en fråga eller två om du kör fast =)