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.
Sym hier ist C#
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
das ists ja gerade, allein jetzt bei meiner aktuellen Verwendung habe ich 2 verschiedene Objekte die kein object sind
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#
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
jo Object
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.
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);
}
}
}
[QUOTE=EagleEye]Sym hier ist C#
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?
es gibt kein List<?> und List ist fest generisch man kann das nicht weglassen
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]