Der Titel war "((object)byte[])" in "List<object>" konvertieren"
Diese Konvertierung ist zum Lösen des eigentlichen Problems, nämlich eine Methode zu schreiben, die unterschiedliche Parameter(typen) unterschiedlich behandelt, werder nötig noch sinnvoll. Die Lösung, die Methode zu überladen, nennt steffen_dec weiter unten.
Halli hallo,
ich benötige eine Funktion, der ich ein byte[] oder ein int[] oder ein uint[] als parameter mitgebe und die als Rückggabewert einen string zurückliefert in dem das jeweilige array formatiert dagestellt wird.
z.B bei einem byte[]:
"0A 01 02 05 1B 3C
32 5C 34 13 CC 7B"
bei int[] soll es dann zb nicht hex sein und 4 stellig.
Ich möchte nun in folgender Funktion das übergebene object so casten, dass ich je nach typ des enthaltenen array anders formatiere.
string ArrayToFormatedString(object array);
1.) Wie castet man am besten von "(object)byte[]" in "List<object>" ?
2.) Wenn wie ist es möglich in List<object> auf .ToString() der kindklasse zuzugreigen? (muss man explizit in byte[] casten)?
3.) Soll man die Klassen Array und ArrayList noch verwenden, oder grundsätzlich nur noch List<>?
Vielen Dank im Voraus
Hallo Rr.Roboto
Herzliche Willkommen im Forum.
Ein Array hat folgende Methode "ToList()", damit kannst du ein Array in eine Liste umwandeln. (Eine List hat auch "ToArray()" ...)
Du kannst mittels "override ToString()" die Methode überschreiben und selbst definieren was zurück kommen soll. Wenn object == Byte dann ist eine explizites Casten nicht notwendig.
Alle nicht typisierten Collections soll man nicht mehr verwenden !
Beste Grüsse
Diräkt
Hallo Diräkt,
Danke für deine Antwort.
- Ein Array hat folgende Methode "ToList()", damit kannst du ein Array in eine Liste umwandeln. (Eine List hat auch "ToArray()" ...)
Ich hab das Probiert, bekomme aber immer eine InvalidCastException:
byte[] array = new byte[]{ ... };
object arrayAsObject = array;
List<object> listOfObjects = ((object[])arrayAsObject ).ToList();
Fehlermeldung:
'InvalidCastException' occurred in the module ... - Error message: Das Objekt des Typs "System.Byte[]" kann nicht in Typ "System.Object[]" umgewandelt werden.
- Du kannst mittels "override ToString()" die Methode überschreiben und selbst definieren was zurück kommen soll. Wenn object == Byte dann ist eine explizites Casten nicht notwendig.
Ah, ok stimmt, .ToString() ist ja virtual, somit ist ja .ToString() der Basis überschrieben
Hallo,
so in der Art kannst Du den Typ abfragen und dein String formatieren wie Du es haben willst...
namespace TestConsole
{
class Program
{
public static void Main(string[] args)
{
byte[] btArray = new byte[]{
0x0A, 0x01, 0x02, 0x05, 0x1B, 0x3C, 0x32, 0x5C, 0x34, 0x13, 0xCC, 0x7B};
int[] iArray = new int[]{
0x0A, 0x01, 0x02, 0x05, 0x1B, 0x3C, 0x32, 0x5C, 0x34, 0x13, 0xCC, 0x7B};
string sRet = ArrayToFormatedString(btArray);
Console.WriteLine("Byte Array formated: " + sRet);
sRet = ArrayToFormatedString(iArray);
Console.WriteLine("Int Array formated: " + sRet);
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
public static string ArrayToFormatedString(object array)
{
string sRet = "";
if (array is byte[])
{
byte[] btArray = array as byte[];
for (int i = 0; i < btArray.Length; i++) {
sRet += btArray[i].ToString("X2");
if (i <= btArray.Length)
sRet += " ";
}
}
else if (array is int[])
{
int[] iArray = array as int[];
for (int i = 0; i < iArray.Length; i++) {
sRet += iArray[i].ToString("X4");
if (i <= iArray.Length)
sRet += " ";
}
}
else if (array is uint[])
{
}
return sRet;
}
}
}
Hi steffen_dec,
vielen Dank für dein Beispiel!
Ich lerne jetzt hieraus:
Was ich noch nicht verstehe:
Hallo Rr.Robot
byte[] array = new byte[] { };
var result = array.ToList();
Funktioniert....
Wenn du erst ein Object daraus machst funktioniert es auch :
byte[] array = new byte[] { };
object arrayAsObject = array;
var result = ((byte[])arrayAsObject).ToList();
Beste Grüsse
Diräkt
Hi Rr.Roboto,
- Man muss in solchen Fällen eine explizite Typeuntersuchung und -umwandlung durchführen, einen "allgemeinen" Weg gibt es nicht.
Kommt drauf an, wir haben hier keine Glaskugel. Ich setze ungern objects ein, da diese ja alle möglichen Typen enthalten können... Warum musst du alles auf objects aufbauen?
schöner ist es wenn man die Methode überladen tut:
public static string ArrayToFormatedString(byte[] btArray)
{
string sRet = "";
for (int i = 0; i < btArray.Length; i++) {
sRet += btArray[i].ToString("X2");
if (i <= btArray.Length)
sRet += " ";
}
return sRet;
}
public static string ArrayToFormatedString(int[] iArray)
{
string sRet = "";
for (int i = 0; i < iArray.Length; i++) {
sRet += iArray[i].ToString("X4");
if (i <= iArray.Length)
sRet += " ";
}
return sRet;
}
Gruß
Steffen
Warum kann zB. ein byte[] nicht als object[] betrachtet werden?
Gern gemachter Fehler - du denkst da nur in eine Richtung. Wenn man das "Rausholen" von Elementen aus dem Array betrachtet, dann würde es klappen - ein Byte ist auch ein Object also könnte man für diese Richtung ein Byte[] auch als Object[] betrachten. Allerdings denkt man oft nicht auch gleichzeitig an das "Reinmachen": In ein Object-Array müsstest du beliebige Objekte reintun können (z.B. ein string, int, etc.) - geht aber nicht, da du ja eigentlich ein Byte-Array hast.
Siehe auch Kovarianz und Kontravarianz.
- Alle nicht typisierten Collections soll man nicht mehr verwenden!
Eigentlich heißt es ja sogar, dass man alle nicht-generischen nicht verwenden soll. Wobei mir jetzt nicht ganz klar ist, warum man StringDictionary im Gegensatz zu einer eigenen gleichbedeutenden Ableitung nicht verwenden soll (mal davon abgesehen, dass SringDictionary sehr primitiv ist und nichtmals XML-Serialisierung implementiert)