[Vb.net] Dynamic Typecasting

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 18-09 20:12

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
Hey tweakertjes,

Ik ben bezig een opzetje te maken voor een xml data storage.
Deze moet straks werken door structs op te slaan in xml.
Deze structs kunnen varieren en om de data op te slaan maak ik gebruik van System.Reflection
om de data op te slaan.

Voorbeeldje:
code:
1
2
3
4
5
Public Structure Storage_Struct
  Dim ProfileName As String                   
  Dim NetworkCard_ServiceName As String
  Dim NetworkCard_ServiceActive As Boolean
End Structure


Dit resulteert in een xml met:
code:
1
2
3
4
<name ProfileName="MyProfile1">
  <NetworkCard_ServiceName>System.String-Cardname</NetworkCard_ServiceName> 
  <NetworkCard_ServiceActive >System.String-True</NetworkCard_ServiceActive > 
</name>


Nu hoef ik alleen mijn struct aan te passen en gaat het opslaan van de data meteen goed.
Mooi, werkt prima.

Maar nu het terughalen van de data.
Ik loop er tegen aan dat het converteren van "True" naar een boolean niet altijd mag.
Daarom heb ik ervoor gekozen om de systemtype ook in de xml op te slaan, zodat ik altijd weet wat voor data type het is.
Waar ik nu eigenlijk heen wil is een situatie waar ik de data weer kan gebruiken.
Maar ik krijg het typecasten niet voor elkaar.

code:
1
2
Dim m_bool as boolean
 m_bool = CType("True", "System.Boolean")


Dit mag dus niet, CType accepteert alleen Spijkerhard System.Boolean, maar daar heb ik niets aan omdat ik dit als string inlees.
Weet iemand hoe je Dynamisch kan typecasten?
Google levert veel hits op over typecast maar niet op deze manier.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Waarom gebruik je niet gewoon een XMLSerializer :?

[ Voor 52% gewijzigd door RobIII op 10-02-2010 12:33 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 18-09 20:12

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
Omdat een Serializer niet overweg kan met ongedefineerde structure collections.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Armageddon_2k schreef op woensdag 10 februari 2010 @ 13:10:
Omdat een Serializer niet overweg kan met ongedefineerde structure collections.
Hoezo niet? En wat versta jij onder 'ongedefineerde structure collections'? Want je zult toch altijd je structure ergens definieeren? Je weet dat je de serializer een handje kunt helpen met attributen?

Maar om op je probleem in te gaan: ik vind sowieso de manier van serializen van type en value nogal vreemd: "System.String-True". Waarom maak je van 't type geen attribuut? En je weet al dat je 't in een bool gaat stoppen (zoals ik al zei, je weet van tevoren toch al hoe je struct er uit ziet); waarom zou je dan uberhaupt nog een string gaan zitten converteren naar een type?

Dan kun je net zo goed zoiets doen:
Visual Basic .NET:
1
m_bool = CType("True", m_bool.GetType())

Maar dat is nogal zinloos :P

[ Voor 35% gewijzigd door RobIII op 10-02-2010 13:18 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 18-09 20:12

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
RobIII schreef op woensdag 10 februari 2010 @ 13:14:
[...]

zoals ik al zei, je weet van tevoren toch al hoe je struct er uit ziet);

Dan kun je net zo goed zoiets doen:
Visual Basic .NET:
1
m_bool = CType("True", m_bool.GetType())

Maar dat is nogal zinloos :P
To be XML serializable, types which inherit from ICollection must have an implementation of Add(System.Object) at all levels of their inheritance hierarchy. Microsoft.VisualBasic.Collection does not implement Add(System.Object).

Ik heb een collection met structures, wat voor structures dit zijn is onbekend.
De form van deze structures dus ook.
Daarom gebruik ik ook system reflection om de vorm van deze structures te bepalen, zoals ik in mijn eerste post al aangaf.

En even terug op je prachtige stukje code met getType(), dat accepteert je compiler dus niet hea.
Anders had ik dat ook wel kunnen doen. Je moet een system type invoeren, en gettype() werkt dus niet.

Alle fields in de structure zijn voor mij onbekend. Ik benader ze doormiddel van system.reflection.fileinfo
In mijn test-scenario weet ik natuurlijk wel hoe mijn structure er uitziet. Maar in de uiteindelijke app niet.
Ik ga dus met een for-loop door de structure fields. En dit werkt niet op de manier hoe jij het omschrijf.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
En heb je hier dan niets aan?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 18-09 20:12

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
Het gaat om "normale" collections, maar ik zal wel even kijken of het mogelijk is om de Collections om te zetten naar NameValueCollection.

Maar even helemaal los van dat hele geneuzel met wat ik aan het maken ben.
Dat gebeurt hier namelijk stelselmatig op tweakers, de eerste 20 reacties gaan altijd om het aanpassen van je huidige concept. Ik snap de gedachten gang wel, maar het gaat helemaal buiten de vraag om. En als ik alleen de vraag had gesteld, had ik een slotje gekregen omdat mijn vraag onderbouwing dan niet voldoende was geweest :P

Dus nogmaals:
Is het mogelijk om te typecasten dmv een string waarin het type staat.

CType(Value,"System.Integer")

Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 15:47

CoolGamer

What is it? Dragons?

Armageddon_2k schreef op woensdag 10 februari 2010 @ 13:46:
Dus nogmaals:
Is het mogelijk om te typecasten dmv een string waarin het type staat.

CType(Value,"System.Integer")
Nee.

Hoe wil je hem dan opslaan?
Object x = CType(Value,"System.Integer")
Heeft geen zin, want hij wordt weer opgeslagen als Object.

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Armageddon_2k schreef op woensdag 10 februari 2010 @ 13:46:
Dus nogmaals:
Is het mogelijk om te typecasten dmv een string waarin het type staat.

CType(Value,"System.Integer")
Again: Dat is nogal onzinnig; de compiler moet van tevoren weten welk type je gaat nodig hebben:

Visual Basic .NET:
1
X = CType(Value,MyString)

Hoe moet de compiler nu controleren of de value uit CType wel aan X assigned mag worden?
* RobIII mept TheCoolGamer :P
Armageddon_2k schreef op woensdag 10 februari 2010 @ 13:46:
Maar even helemaal los van dat hele geneuzel met wat ik aan het maken ben.
Dat gebeurt hier namelijk stelselmatig op tweakers, de eerste 20 reacties gaan altijd om het aanpassen van je huidige concept. Ik snap de gedachten gang wel, maar het gaat helemaal buiten de vraag om.
Dat doen we alleen als je op een verkeerd/raar spoor zit; niet om je te jennen hoor. Wees blij dat we je er op wijzen en wees blij dat we met alternatieven komen.

[ Voor 38% gewijzigd door RobIII op 10-02-2010 13:55 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 18-09 20:12

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
TheCoolGamer schreef op woensdag 10 februari 2010 @ 13:52:
[...]
Nee.
Hoe wil je hem dan opslaan?
Object x = CType(Value,"System.Integer")
Heeft geen zin, want hij wordt weer opgeslagen als Object.
Ik sla hem weer op in dezelfde structure waar hij ook in is gemaakt.
Het zal dus altijd een type zijn (string, boolean, integer). Maar omdat de vorm van de structure dus onbekend is, weet ik niet van te voren wat voor type het is. Maar dat hoeft ook niet.
Stel:

code:
1
2
3
4
5
Public Structure Storage_Struct
        Dim ProfileName As String                   
        Dim NetworkCard_ServiceName As Integer
        Dim ServiceName As Boolean
End Struct


Deze structure kan dus alle vormen hebben die je maar kan bedenken, dit is dus een voorbeeld.
Als je dan:

code:
1
   Dim temp as Storage_Struct


Dan is Storage_Struct.ProfileName een gedefineerd type. Maar omdat ik niet van te voren weet wat voor type het is, haal ik dit op doormiddel van SystemReflection:

temp .GetType().GetFields

Hiermee haal ik dus op:
ProfileName : String
NetworkCard_ServiceName : Integer
ServiceName : Boolean

Maar dat is alleen in deze situatie, en dus niet van te voren te bepalen.
Dus ik wil een typecast doen doormiddel van bijvoorbeeld:
CType(Value,"System.Integer")

Maar dat werkt dus niet.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Nou... zet 't in een switch? (Select case in vb.net volgens mij). Dan hoef je ook geen CType te gebruiken maar kun je meteen CBool/CInt/CStr gebruiken.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 18-09 20:12

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
Ik pleur hier even een stukje code neer, want ik heb het idee dat het hele onbekend en reflection verhaal een beetje niet begrepen wordt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
            Dim m_struct As New Storage_Struct
            Dim Struct_Field As System.Reflection.FieldInfo

            'Loop through all fields of the item
            For Each Struct_Field In m_struct.GetType().GetFields

                 'Ophalen waarde uit xml
                 m_FieldValue = xml_Get(Struct_Field.Name)

                 Struct_Field.SetValue(m_struct, CType(m_FieldValue, String))

            Next


Dus, de Stuctures zijn van te voren onbekend, maar niet ongedefineerd.

[ Voor 4% gewijzigd door Armageddon_2k op 10-02-2010 14:08 ]


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 18-09 20:12

Armageddon_2k

Trotse eigenaar: Yamaha R6

Topicstarter
RobIII schreef op woensdag 10 februari 2010 @ 14:00:
[...]

Nou... zet 't in een switch? (Select case in vb.net volgens mij). Dan hoef je ook geen CType te gebruiken maar kun je meteen CBool/CInt/CStr gebruiken.
Jah dat heb ik nu ook, maar das lelijk. Daarom ook de vraag of het mooier/netter kan.

Acties:
  • 0 Henk 'm!

  • CoolGamer
  • Registratie: Mei 2005
  • Laatst online: 15:47

CoolGamer

What is it? Dragons?

Je zal de waarde er dan ook weer m.b.v. reflectie in moeten zetten. Hiervoor is casten niet nodig. Weet alleen niet zo snel welke methodes je hiervoor nodig hebt.

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸

Pagina: 1