C# istanziare oggetto specificando al posto del tipo una stringa

mercoledì 25 novembre 2009 - 14.20

andrestu Profilo | Expert

cioè vi spiego con un esempio, se voglio creare una nuova textbox(facendo un esempio con un controllo aspnet) scrivo:

TextBox TxtBox1 = new TextBox();

io vorrei lanciare lo stesso comando solo che al posto della parola "TextBox" vorrei inserire una stringa in modo che con lo stesso comando posso istanziare diversi oggetti in base al contenuto della stringa, ecco un esempio:

string variabile = "TextBox";

variabile TxtBox1 = new variabile();

così ovviamente non funziona ma lho scritto x spiegare l'esempio, cè il modo di far questo?

alx_81 Profilo | Guru

>cioè vi spiego con un esempio, se voglio creare una nuova textbox(facendo
>un esempio con un controllo aspnet) scrivo:
>
>TextBox TxtBox1 = new TextBox();
>
>io vorrei lanciare lo stesso comando solo che al posto della
>parola "TextBox" vorrei inserire una stringa in modo che con
>lo stesso comando posso istanziare diversi oggetti in base al
>contenuto della stringa, ecco un esempio:
>
>string variabile = "TextBox";
>
>variabile TxtBox1 = new variabile();
>
>così ovviamente non funziona ma lho scritto x spiegare l'esempio,
>cè il modo di far questo?
ciao,
mmmmh.. se i tipi sono pochi, meglio fare che tutti i tipi implementano la stessa interfaccia, e poi fare un case sulla stringa istanziando il tipo specifico.

--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

andrestu Profilo | Expert

e ma era proprio questo che volevo evitare, se i tipi iniziano a diventare tanti mi viene una serie di case che non finisce più.

secondo te se i tipi arrivano anche a 100 posso avere dei problemi con un case così lungo?

alx_81 Profilo | Guru

>e ma era proprio questo che volevo evitare, se i tipi iniziano
>a diventare tanti mi viene una serie di case che non finisce
>più.
>
>secondo te se i tipi arrivano anche a 100 posso avere dei problemi
>con un case così lungo?
no, tanto in questo caso è mutualmente esclusivo. Più che altro, non riesco ad immaginare cosa vuoi fare
--

Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

andrestu Profilo | Expert

inserire dei controlli aspnet dinamicamente

Teech Profilo | Expert

Non ti serve nemmeno la stringa se usi la reflection.
Scrivo in VB perchè mi trovo meglio:

Dim obj as Textbox DirectCast(GetType(obj).GetConstructor(New System.Type()).Invoke(New Object()), obj)
in C# dovrebbe essere una cosa del genere:
{ Textbox obj = (obj)typeof(obj).GetConstructor(new System.Type()).Invoke(new object()); }
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

andrestu Profilo | Expert

ok grazie faccio due prove e ti faccio sapere.

Comunque mi hanno detto che le prestazione con la reflection vengono notevolmente ridotte, cosa ne pensi?

Teech Profilo | Expert

Onestamente non saprei dire se con la Reflection le prestazioni vengono inficiate e di quanto...
Per contro però sono sicuro che con i Generics le prestazioni vengono migliorate (risolti i problemi di boxing) e quindi creando una classe generica e utilizzando la reflection al suo interno non credo ci possano essere significativi peggioramenti prestazionali...
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5