Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

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

Moderationshinweis von herbivore (31.12.2012 - 08:06:02):

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.

Rr.Roboto
myCSharp.de - Member



Dabei seit:
Beiträge: 5

Themenstarter:

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

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Diräkt
myCSharp.de - Member



Dabei seit:
Beiträge: 619
Herkunft: Schweiz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Rr.Roboto
myCSharp.de - Member



Dabei seit:
Beiträge: 5

Themenstarter:

beantworten | zitieren | melden

Hallo Diräkt,
Danke für deine Antwort.
Zitat
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();
Fehler
'InvalidCastException' occurred in the module ... - Error message: Das Objekt des Typs "System.Byte[]" kann nicht in Typ "System.Object[]" umgewandelt werden.
Zitat
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.
Ah, ok stimmt, .ToString() ist ja virtual, somit ist ja .ToString() der Basis überschrieben
Dieser Beitrag wurde 3 mal editiert, zum letzten Mal von Rr.Roboto am .
private Nachricht | Beiträge des Benutzers
steffen_dec
myCSharp.de - Member



Dabei seit:
Beiträge: 325

beantworten | zitieren | melden

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;
		}
	}
}
private Nachricht | Beiträge des Benutzers
Rr.Roboto
myCSharp.de - Member



Dabei seit:
Beiträge: 5

Themenstarter:

beantworten | zitieren | melden

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[])?
private Nachricht | Beiträge des Benutzers
Diräkt
myCSharp.de - Member



Dabei seit:
Beiträge: 619
Herkunft: Schweiz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
steffen_dec
myCSharp.de - Member



Dabei seit:
Beiträge: 325

beantworten | zitieren | melden

Hi Rr.Roboto,
Zitat von 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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von steffen_dec am .
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 3138

beantworten | zitieren | melden

Zitat von Rr.Roboto
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.
private Nachricht | Beiträge des Benutzers
Marsti
myCSharp.de - Member



Dabei seit:
Beiträge: 124

beantworten | zitieren | melden

[offtopic]
Zitat von Diräkt
3. 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)[/offtopic]
private Nachricht | Beiträge des Benutzers