2009-07-10 6 views
5

Ich habe eine Arraylist, die verschiedene Arten von Werten darin, 1. wert->String, 2. wert->Datetime, 3. Wert bekommt ->boolean und 4. Wert ist int, wie kann ich thier Art finden und diese Werte entsprechend zuweisen, wird jede Hilfe dankbar :)Objekttyp erhalten und Werte zuweisen entsprechend

hier ist mein Code:

foreach (object obj in lstTop) 
      { 

       if(obj.GetType() == string) 
       {do this...) 
       else if(obj.GetType() == DateTime) 
       {do this....} 
       else if(obj.GetType() == bool) 
       {do this....} 
       else if(obj.GetType() == Int) 
       {do this....} 
      } 

Vielen Dank an all, meinen letzten Code:

string Subscription = ""; 
     DateTime issueFirst; 
     DateTime issueEnd; 

     foreach (object obj in lstTop) 
     { 
      ///Type t = obj.GetType(); 
      if (obj is string) 
       Subscription += obj + ","; 
      else if (obj is DateTime) 
      { 
       Subscription += Convert.ToDateTime(obj).ToShortDateString() + ","; 
      } 
      /// else if (t == typeof(DateTime))     
     } 
    return ("User Authenticated user name: " + userName + ", Subscription: " + Subscription); 
+0

Fügen Sie typeof() vor dem Typ, z. typeof (Zeichenfolge), typeof (DateTime). –

+0

'2.0' an sich ist eine sehr schlechte Wahl. Bitte achten Sie mehr auf die Auto-Suggest-Aufforderungen für Ihre Fragen in der Zukunft: richtige Tagging ist, wie qualifizierte Leute Ihre Frage finden. –

+2

Wenn Sie können, können Sie aus dieser Situation herauskommen. Eine Array-Liste ist eine schreckliche Möglichkeit, ein Vier-Tupel von Daten darzustellen. Erwägen Sie, eine benutzerdefinierte Klasse zu definieren, die diese vier Daten enthält und diese stattdessen verwendet. –

Antwort

7
foreach (object obj in lstTop) 
     { 

      if(obj is string) 
      {do this.....} 
      else if(obj is DateTime) 
      {do this.....} 
      else if(obj is bool) 
      {do this.....} 
      else if(obj is Int) 
      {do this.....} 
      else 
      { 
       // always have an else in case it falls through 
       throw new Exception(); 
      } 
     } 
2

Arraylisten in .Net 2.0 sind fast immer der falsche Weg, es zu tun. Selbst wenn Sie nicht wissen, was die Liste enthalten wird, verwenden Sie besser das generische List<Object>, weil das anderen mitteilt, dass die Liste wirklich alles enthalten kann und nicht nur ein Rest von einem .Net 1.1 Programmierer ist.

Other than that, sollte das is Schlüsselwort tun, was Sie wollen:

if (obj is string) 
    // do this 
else if (obj is DateTime) 
    // do this 
// ... 

aktualisieren Ich weiß, das ist alt, aber es kommt heute in meinen Notizen auf. Lesen sie wieder, kommt mir der Gedanke, dass eine andere schöne Möglichkeit, dies über Typ Auflösung für eine überladene Funktion zu tun ist:

void DoSomething(string value) { /* ... */ } 
void DoSomething(DateTime value) { /* ... */ } 

DoSomething(obj); 
+0

"Aber anders als das, Frau Lincoln ..." – mquander

1

Die einfachste Lösung, die eine Schleife nicht zu verwenden, da Sie genau wissen, was in der Liste ist.

string myString = (string) lstTop[0]; 
DateTime myDate = (DateTime) lstTop[1]; 
bool  myBool = (bool)  lstTop[2]; 
int  myInt = (int)  lstTop[3]; 
+0

Die Indizes können jedoch unterschiedlich sein. Nicht immer zuverlässig. –

+0

Ich würde das nicht empfehlen, da die direkten Umwandlungen Laufzeitfehler verursachen, wenn die Umwandlung fehlschlägt. –

0

Nur einig etwas saubereren Code:

foreach (object obj in lstTop) 
     { 

      if(obj is string) 
      {do this...) 
      else if(obj is DateTime) 
      {do this....} 
      else if(obj is bool) 
      {do this....} 
      else if(obj is int) 
      {do this....} 
     } 

Wenn Ihr Array immer die gleichen Objekte in der gleichen Position hat aber nur Index in das Array und tut direkte Würfe.

0
 foreach (object obj in lstTop) 
     { 

      if(obj.GetType() == typeof(string)) 
      {do this...) 
      else if(obj.GetType() == typeof(DateTime)) 
      {do this....} 
      else if(obj.GetType() == typeof(bool)) 
      {do this....} 
      else if(obj.GetType() == typeof(int)) 
      {do this....} 
     } 

GetType Die Methode gibt die System.Type des Objekts. Daher müssen Sie es mit der anderen System.Type vergleichen, die Sie mit typeof erhalten.

1

Wenn Ihre Liste genau ein Wert jedes Typs enthält, die Sie in einem Dictionary stattdessen speichern kann (wenn eine ArrayList Verwendung keine spezifische Anforderung ist), und rufen Sie nur den Wert auf der Basis des angeforderten Typ:

private Dictionary<Type, Object> data = GetDataList(); 
string myString = (string)data[typeof(string)]; 
int myInt = (int)data[typeof(int)]; 

Dadurch wird das Abrufen der Werte etwas robuster, da es nicht von den Werten abhängt, die in einer bestimmten Reihenfolge angezeigt werden.

Beispiel die Arraylist zu einem solchen Wörterbuch der Umwandlung:

ArrayList data = new ArrayList(); 
data.Add(1); 
data.Add("a string"); 
data.Add(DateTime.Now); 

Dictionary<Type, Object> dataDictionary = new Dictionary<Type, object>(); 
for (int i = 0; i < data.Count; i++) 
{ 
    dataDictionary.Add(data[i].GetType(), data[i]); 
} 
1

Stattdessen primitive Typen verwenden, würde ich eine abstrakte Klasse, die jeden Datentyp eingekapselt.Dann kann die Logik der Handhabung dieses Typs in die Klasse selbst eingebettet werden.

foreach(MyBaseData data in lstData) 
{ 
    data.DoTheRightThing(); 
} 

Im allgemeinen kann jeder Code, der auf dem Typ eines Objekts schaltet soll ein Design Geruch in Betracht gezogen werden - es ist nicht unbedingt falsch sein kann, aber es ist wahrscheinlich eine gute Idee, einen Blick auf mich zu nehmen.

Während das Schreiben einer Klasse zum Einkapseln eines einfachen Typs sich wie unnötige Arbeit anfühlt, glaube ich nicht, dass ich jemals bereut habe, es zu tun.

+0

Das Erstellen von Erweiterungsmethoden für einfache Typen wäre wahrscheinlich weniger aufwändig als die Kapselung jedes einzelnen. – Shocked

Verwandte Themen