Laden...

Methode soll byte[]- und int/uint[]- Parameter unterschiedlich behandeln

Erstellt von Rr.Roboto vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.284 Views
Hinweis von herbivore vor 11 Jahren

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.

R
Rr.Roboto Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren
Methode soll byte[]- und int/uint[]- Parameter unterschiedlich behandeln

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

D
615 Beiträge seit 2009
vor 11 Jahren

Hallo Rr.Roboto

Herzliche Willkommen im Forum.

  1. Ein Array hat folgende Methode "ToList()", damit kannst du ein Array in eine Liste umwandeln. (Eine List hat auch "ToArray()" ...)

  2. 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.

  3. Alle nicht typisierten Collections soll man nicht mehr verwenden !

Beste Grüsse

Diräkt

R
Rr.Roboto Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren

Hallo Diräkt,
Danke für deine Antwort.

  1. 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.

  1. 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

S
322 Beiträge seit 2007
vor 11 Jahren

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;
		}
	}
}
R
Rr.Roboto Themenstarter:in
5 Beiträge seit 2012
vor 11 Jahren

Hi steffen_dec,

vielen Dank für dein Beispiel!

Ich lerne jetzt hieraus:

  • Man muss in solchen Fällen eine explizite Typeuntersuchung und -umwandlung durchführen, einen "allgemeinen" Weg gibt es nicht.

Was ich noch nicht verstehe:

  • Warum kann zB. ein byte[] nicht als object[] betrachtet werden? Liegt das nur daran, dass kein expliziter cast definiert ist (object[])?
D
615 Beiträge seit 2009
vor 11 Jahren

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

S
322 Beiträge seit 2007
vor 11 Jahren

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

2.891 Beiträge seit 2004
vor 11 Jahren

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.

M
120 Beiträge seit 2009
vor 11 Jahren
  1. 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)