[c#] casten van object naar string[]

Pagina: 1
Acties:

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Ik heb een wrapper voor een OPC client. Deze heeft een functie om een lijst met OPC servers op te halen. Deze functie geeft een object terug. Eigenlijk is dit object een string array. Om een of andere reden krijg ik hem niet gecast

vb:
C#:
1
2
OPCServer test=new OPCServer ();
object x = test.GetOPCServers(null);


geporbeerd:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
//1
string[] s;
s=(string[])x;

//2
string s=x[0];

//3 
string []s=x;

//4
string s=((string[])(x))[0];


Is hij wel castable (bestaat dat woord)? Of doe ik gewoon iets doms?

bij 4 krijg ik de fout:
code:
1
Unable to cast object of type 'System.String[*]' to type 'System.String[]'.


Edit:
als ik heb debug en een watch op x zet is deze van het type ' object{string[]}' (en in het huidige geval staan hier 5 strings in)

[ Voor 20% gewijzigd door elgringo op 21-05-2007 09:06 ]

if broken it is, fix it you should


  • cowgirl
  • Registratie: November 2000
  • Laatst online: 17-12-2020
Is het returntype van test.GetOPCServers echt een string[]? Dan is de 2e regel van je eerste code gewoon fout. Daar kan je dan gewoon
C#:
1
string[] x = test.GetOPCServers(null);

neerzetten.

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
cowgirl schreef op maandag 21 mei 2007 @ 09:11:
Is het returntype van test.GetOPCServers echt een string[]? Dan is de 2e regel van je eerste code gewoon fout. Daar kan je dan gewoon
C#:
1
string[] x = test.GetOPCServers(null);

neerzetten.
returntype van de functie is een object:
C#:
1
object GetOPCServers(object Node);

(node is ip adres, null = lokaal).

Alleen het object is van het type string[] (aldus een watch)

[ Voor 7% gewijzigd door elgringo op 21-05-2007 09:16 ]

if broken it is, fix it you should


Verwijderd

overal waar je dat ding als string[] wilt gebruiken zul je hem dan moeten casten (want hij blijft hem gewoon zien als object)

of je moet een deep copy maken maar dat is een erg dure actie

edit:
ik bedoel dus, overal waar je hem wilt gebruiken
(string[])
ervoor zetten en dan wordt hij gezien als string array maar je kunt beter het returntype ook echt een string[] maken... dan weet je tenminste dat het allemaal strings zijn object als returntype is niet echt handig omdat je nooit kunt weten wat erin zit.

[ Voor 47% gewijzigd door Verwijderd op 21-05-2007 09:20 ]


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Verwijderd schreef op maandag 21 mei 2007 @ 09:18:
overal waar je dat ding als string[] wilt gebruiken zul je hem dan moeten casten (want hij blijft hem gewoon zien als object)

of je moet een deep copy maken maar dat is een erg dure actie

edit:
ik bedoel dus, overal waar je hem wilt gebruiken
(string[])
ervoor zetten en dan wordt hij gezien als string array maar je kunt beter het returntype ook echt een string[] maken... dan weet je tenminste dat het allemaal strings zijn object als returntype is niet echt handig omdat je nooit kunt weten wat erin zit.
returntype kan ik niet veranderen, het is nml een interop van een opc dll.
en casten werkte dus niet, vandaar dit topic....

oplossing iig gevonden, gewoon casten naar een array:
C#:
1
2
3
4
5
Array x = (Array)test.GetOPCServers(null);
for (int i = x.GetLowerBound(0); i <= x.GetUpperBound(0); i++)
{
    comboBox1.Items.Add((string)x.GetValue(i));
} 

[ Voor 4% gewijzigd door elgringo op 21-05-2007 09:27 ]

if broken it is, fix it you should


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Ik heb geen kaas gegeten van C#, maar deze foutmelding lijkt me toch zeer duidelijk:
code:
1
Unable to cast object of type 'System.String[*]' to type 'System.String[]'.
Je moet het casten naar String[*] in plaats van String[].

[ Voor 3% gewijzigd door BalusC op 21-05-2007 09:40 ]


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Het lijkt erop dat de returnwaarde niet helemaal een normale string[] is, maar waar "string[ *]" dan precies voor staat... :?

Anyway, wat je wel zou kunnen proberen is de returnwaarde te casten naar een System.Array. Dan moet je in ieder geval alle elementen kunnen benaderen.

[ Voor 0% gewijzigd door MrBucket op 21-05-2007 09:48 . Reden: Hmm, spuit elf, oplossing was al gegeven... ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Dat sterretje slaat volgens mij op de index die je aan de subscript operator kan meegeven. Iig, het type string[ * ] ken ik niet. :)

Ik snap trouwens niet waarom de eerste het niet doet. Dat zou afaik toch moeten werken ? misschien ff testen

Dit lukt gewoon:
code:
1
2
3
4
5
6
object o = new string[] {"f", "test", "bliep"};
string[] sa = (string[])o;
            
foreach( string s in sa ){
     Console.WriteLine (s);
}

[ Voor 36% gewijzigd door whoami op 21-05-2007 09:51 ]

https://fgheysels.github.io/


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
@Whoami: je maakt nu een 'echte' string-array aan (dus string[ ], en niet zo'n string[ * ]); logisch dat het casten dan goedgaat. Maar welk type object TS nu precies terugkrijgt uit die functie, dat is niet duidelijk.

Misschien heeft het iets te maken met de startindex van de array? Om hem als een c# array aan te kunnen spreken moet het laagste element een index van 0 hebben, maar in een System.Array hoeft dat geloof ik niet per se. Misschien dat daar het '*' vandaan komt?

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
whoami schreef op maandag 21 mei 2007 @ 09:48:
Dat sterretje slaat volgens mij op de index die je aan de subscript operator kan meegeven. Iig, het type [html]<code>string[ * ]</code>[/html] ken ik niet. :)

Ik snap trouwens niet waarom de eerste het niet doet. Dat zou afaik toch moeten werken ? misschien ff testen

Dit lukt gewoon:
code:
1
2
3
4
5
6
object o = new string[] {"f", "test", "bliep"};
string[] sa = (string[])o;
            
foreach( string s in sa ){
     Console.WriteLine (s);
}
dat werkt gewoon.
Ik vermoet dat die interop dit veroorzaakt, als ik hem eerst cast naar een array en deze uitlees werkt het iig wel.

if broken it is, fix it you should


  • cowgirl
  • Registratie: November 2000
  • Laatst online: 17-12-2020
whoami schreef op maandag 21 mei 2007 @ 09:48:
Dat sterretje slaat volgens mij op de index die je aan de subscript operator kan meegeven. Iig, het type [html]<code>string[ * ]</code>[/html] ken ik niet. :)
Wat ik via google gevonden heb krijg je die foutmelding als de string[] niet zero-based is, dus bijv. uit VB komt. Zie http://forums.microsoft.c...x?PostID=1561814&SiteID=1

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
MrBucket schreef op maandag 21 mei 2007 @ 09:57:
@Whoami: je maakt nu een 'echte' string-array aan (dus string[ ], en niet zo'n string[ * ]); logisch dat het casten dan goedgaat. Maar welk type object TS nu precies terugkrijgt uit die functie, dat is niet duidelijk.

Misschien heeft het iets te maken met de startindex van de array? Om hem als een c# array aan te kunnen spreken moet het laagste element een index van 0 hebben, maar in een System.Array hoeft dat geloof ik niet per se. Misschien dat daar het '*' vandaan komt?
Hier zit wel een kern van waarheid in. getlowerbounds geeft 1 als laagste warde terug. Dus dat zal hem geweest zijn.

[ Voor 5% gewijzigd door elgringo op 21-05-2007 10:00 ]

if broken it is, fix it you should

Pagina: 1