Object in List casten

Ich stehe gerade vor dem Problem dass ich ein Object bekomme und nicht weiß was es ist.
Aber wenn es eine Liste ist will ich gucken ob sie leer ist und dementsprechend etwas anderes zurück geben. Das einzige was ich dazu bekomme ist noch den Type von dem Objekt.

Ich hab gerade nicht wirklich einen Weg gefunden wie ich das Ding in eine Liste bekomme.

Du kannst doch casten. Oder instanceof verwenden. Oder ich verstehe Dein Problem nicht.

Sym hier ist C# :wink:
ich kann den Typ auf List<> auffragen nur ich kann kein Objekt mit List<> machen
Caste ich auf List knallts sobald die Liste z.B. als List erzeugt wurde

List<Object> list = object as List<Object>;
// list ist null wenn was anderes

Frage ist er wer liefert Dir nur Object? Hast Du schon Reflection versucht?

das ists ja gerade, allein jetzt bei meiner aktuellen Verwendung habe ich 2 verschiedene Objekte die kein object sind :wink:
Das ist halt in ner Util Klasse (Implementiert IValueConverter) um Elemente in der UI ein und auszublenden
Daher kann dort alles mögliche drin sein

Edit:
Hmmm Reflection, ich hatte gehofft dass ich das nicht machen muss

[QUOTE=EagleEye]Sym hier ist C# :wink:
ich kann den Typ auf List<> auffragen nur ich kann kein Objekt mit List<> machen
Caste ich auf List knallts sobald die Liste z.B. als List erzeugt wurde[/QUOTE]
Danke :smiley:

na die Objecte der Liste müssen doch eigentlich einen gemeinsamen Papa haben

ist nur halb so schwer wie es klingt

jo Object :wink:
einmal ists eine Liste mit Strings und einmal eigene Objekte

Hast du auf die Schnelle ein Beispiel wie das geht mit Reflections? Ich hab die schon ewig nicht mehr benutzt und glaube bei C# sogar noch nie.
Sonst guck ich heute Nachmittag wenn ich wieder da bin mal nach wie das geht.

harhar :lol:

Dein Stichwort für die MSDN ist erstmal Type. Der Rest ist einfach durch den „Baum“ watscheln. Das folgende Beispiel ist aus meiner Configurations Klasse, was fast wie Serialisierung funktioniert (nur unabhängig von Assembly-Version). Da verwende ich aber auch noch Annotation/Attribute (wie auch immer das bei C# heist) um die einzelnen Variablen in die XML zu speichern.


		public void Save() {
			// (C) x8Bit.de - Lizenz ist AGPL
			try {
				Directory.CreateDirectory(Path.GetDirectoryName(filename));
				
				XmlTextWriter xml = new XmlTextWriter(this.filename, System.Text.Encoding.UTF8);
				xml.Formatting = Formatting.Indented;
				xml.WriteStartDocument();
				xml.WriteStartElement("configuration");

				xml.WriteAttributeString("project", Misc.Project);
				xml.WriteAttributeString("program", Misc.Program);
				
	            Type t = this.GetType();
	            PropertyInfo[] propertyInfos = t.GetProperties();
	            foreach (PropertyInfo pi in propertyInfos) {
					Object[] attribute = pi.GetCustomAttributes(true);
					foreach(Object a in attribute) {
						if (a.GetType().Equals(typeof(ConfigurationInfoAttribute))) {
							Object value = pi.GetValue(this, null);
							String desc = ((ConfigurationInfoAttribute)a).Description;
							String name = pi.Name;
							String type = "(unknown)";
							String max = ((ConfigurationInfoAttribute)a).Maximum;
							String min = ((ConfigurationInfoAttribute)a).Minimum;
							
							if (value == null) 
								value = "(null)";
							else
								**type = value.GetType().Name;**
							
							if (((value as IEnumerable) != null) && ((value as String) == null)) {
								xml.WriteStartElement("enumerable");
								xml.WriteAttributeString("type", type);
								xml.WriteAttributeString("name", name);
								xml.WriteAttributeString("description", desc);
								if (max != null) {
									xml.WriteAttributeString("maximum", max);
									xml.WriteAttributeString("minimum", min);
								}
								foreach(String s in (value as IEnumerable)) xml.WriteElementString("value", s);
								xml.WriteEndElement();
							} else {
								xml.WriteStartElement("property");
								xml.WriteAttributeString("type", type);
								xml.WriteAttributeString("name", name);
								xml.WriteAttributeString("value", value.ToString());
								xml.WriteAttributeString("description", desc);
								if (max != null) {
									xml.WriteAttributeString("maximum", max);
									xml.WriteAttributeString("minimum", min);
								}
								xml.WriteEndElement();
							}
						}
					}
				} // foreach
				
				xml.WriteEndElement();
				xml.Flush();
				xml.Close();
			} catch(Exception ex) {
				Debug.WriteLine(ex);
			}
		}
	}

danke das werde ich mir gleich mal genauer angucken

[QUOTE=EagleEye]Sym hier ist C# :wink:
ich kann den Typ auf List<> auffragen nur ich kann kein Objekt mit List<> machen
Caste ich auf List knallts sobald die Liste z.B. als List erzeugt wurde[/QUOTE]

Offtopic: sowas wie

        List<String> ls = new ArrayList<String>();
        ls.add("abc");
        Object o = ls;
        List<?> l = (List)o;
        Object first = l.get(0);
        System.out.println(first);

oder auch Cast auf wie genannt List geht in C# nicht?

kann man auch nicht ganz ohne Generics leben (falls irgendwie vergleichbar)
und einfach nur List als List verwenden?

das wäre ja ein erstaunlicher Nachteil in einem zentralen Feld,
keine Frage von Syntax-Spielerei oder Speicher-Gefrickel,
sondern im Herzen der objektorientierten Arbeit,
ist C# so schlecht? :wink:

es gibt kein List<?> und List ist fest generisch man kann das nicht weglassen :wink:
Der Hintergrund ist wohl so, bei Java wird wohl einfach durch den Compiler ein Cast eingefügt und du mit Objects arbeitest, wogegen das bei C# wohl irgendwie direkt mit den Objekten arbeitet.
Daher klappt auch der Cast auf List nicht

Wie schaut denn deine Methode aus (Signatur)?
Und was möchtest du denn machen falls es eine Liste ist? Nur wissen ob leer oder nicht?

Vielleicht hilft dir das etwas weiter:
[CSHARP]
static void Main(string[] args)
{
List list = new List();
list.Add(“ab”);
list.Add(“cd”);
GetObject(list, list.GetType());
list.Clear();
GetObject(list, list.GetType());
int a = 0;
GetObject(a, a.GetType());
}

public static void GetObject(object obj, Type typeOfObject)
{
if (obj.GetType().IsGenericType && obj is IEnumerable)
{
if (((IEnumerable)obj).GetEnumerator().MoveNext())
{
Console.WriteLine(“Wir haben eine nicht leere Liste!”);
}
}
}
[/CSHARP]

@Pippl
wow genau das was ich will, manchmal sieht man doch so einfache Lösungen nicht :smiley: