2009-07-10 12 views
5

I持ってそれで、第一付加価値>文字列、第二付加価値>日時、第三値を値の異なる種類を取得するのArrayList - >ブールと第四値は、私はthierタイプを見つけ、任意のヘルプは高く評価され、それに応じてこれらの値を割り当てないか、int型です:)ここオブジェクトの種類を取得し、値を割り当てるに応じ

は私のコードです:

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

、私の最終的なコードをあなたのすべてをありがとう:.NET 2.0で

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

タイプの前にtypeof()を追加します。 typeof(文字列)、typeof(日付時間)。 –

+0

'2.0'自体は本当に悪いタグの選択です。今後、あなたの質問に対する自動提案のプロンプトにもっと注意を払うようにしてください。正しいタグ付けは、有資格者があなたの質問をどのように見つけるかということです。 –

+2

可能であれば、この状況から抜け出してください。配列リストは、4タプルのデータを表すひどい方法です。これらの4つのデータを保持するカスタムクラスを定義し、代わりに使用することを検討してください。 –

答えて

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

のArrayListはほとんど常にそれを行うには間違った方法です。リストが保持するものがわからなくても、一般的なList<Object>を使用するほうが良いです。これは、リストが実際に何かを保持できることを他の人に伝え、.Net 1.1プログラマーから残されたものではないからです。それ以外

isキーワードは、あなたが欲しいものを行う必要があります。

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

更新を私はこれが古いですけど、それが今日の私の通知に出てきます。

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

DoSomething(obj); 
+0

「それ以外、リンカーン夫人...」 – mquander

1

最も簡単な解決策は、あなたがあなたのリストにあります正確に何を知っているので、ループを使用するのではありません。もう一度それを読んで、これを行うには、別の良い方法は、オーバーロードされた関数の型解決を経由していることを私に起こります。

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

インデックスは異なるかもしれませんが。常に信頼できるとは限りません。 –

+0

キャストが失敗した場合、直接キャストでランタイムエラーが発生するため、これはお勧めできません。 –

0

ただ、いくつかのわずかクリーナーコード:

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

あなたの配列は常に配列にかかわらず、同じ場所で同じオブジェクト、単にインデックスを持っており、直接的なキャストを行う場合。

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メソッドは、オブジェクトのSystem.Typeを返します。したがって、別のSystem.Typeと比較する必要があります。typeofを使用します。

1

あなたのリストは、(ArrayListを使用すると、特定の要件ではない場合)あなたの代わりDictionaryでそれを保存することができ、各タイプの1つの値が含まれている場合は、ちょうど要求された型に基づいて値を取得:

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

これは、特定の順序で表示される値に依存しないため、値を少し強くフェッチする処理を行います。そのような辞書にArrayListの変換の

例:代わりにプリミティブ型を使用する

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

、Iは、各データ・タイプをカプセル化する抽象クラスを持っているだろう。次に、その型を扱うロジックをクラス自体に組み込むことができます。

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

、デザインの臭いを考慮すべきオブジェクトの種類に切り替え任意のコード - それは必ずしも間違ってはないかもしれないが、それはおそらく、それをもう一度見てとることをお勧めします。

単純な型をカプセル化するためのクラスを書くことは、不必要な作業のように感じるかもしれませんが、私はそれをやったことを後悔していないと思います。

+0

単純な型の拡張メソッドを作成することは、おそらくそれぞれのものをカプセル化することよりも面倒ではありません。 – Shocked

関連する問題