C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: object型の中身のlist展開


(過去ログ 106 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■63550 / inTopicNo.1)  object型の中身のlist展開
  
□投稿者/ li- (1回)-(2012/09/05(Wed) 17:30:47)

分類:[.NET 全般] 

こんにちは。下記の質問をさせて頂きます。
Reflectionを用いてInvokeMemberなどで返ってきた object型の変数(ここではxとします。)の中身を見ると、
List<int> や List< HogeClass > などList型の時があります。

objectがリスト型なのかどうかは
if( x.GetType().GetGenericTypeDefinition() == typeof(List<>) ){
・・・
}
で判定できましたが、object型のxの展開ができずに困っています。
最終的にPropertyInfoなどでGetValueで渡したいので、List<object>としたいのですが、どうしたら良いでしょうか?

引用返信 編集キー/
■63551 / inTopicNo.2)  Re[1]: object型の中身のlist展開
□投稿者/ pang2 (1回)-(2012/09/05(Wed) 18:34:49)
> if( x.GetType().GetGenericTypeDefinition() == typeof(List<>) ){

この時点で、IEnumerableインターフェースが保障されているので、xをIEnumerableにキャストしてforeachで回して中身を取り出す。
引用返信 編集キー/
■63552 / inTopicNo.3)  Re[1]: object型の中身のlist展開
□投稿者/ 魔界の仮面弁士 (53回)-(2012/09/05(Wed) 20:43:34)
No63550 (li- さん) に返信
> で判定できましたが、object型のxの展開ができずに困っています。
> 最終的にPropertyInfoなどでGetValueで渡したいので、List<object>としたいのですが、どうしたら良いでしょうか?

<int> や <HogeClass> の部分を得たいなら、x.GetType().GetGenericArguments() で得られます。

そうではなく、List<不明>型を List<object> にしたいという話だとしたら、
そもそもキャストできませんから、何かしらの変換が必要ですね。

変換ということで List<T>.ConvertAll<object> を呼ぶ…と言いたいところですが、
IList か IEnumerable にキャストして List<object> に詰め直した方が早いかな。


  List<object> result = null;
  if (x.GetType().GetGenericTypeDefinition() == typeof(List<>))
  {
      result = new List<object>();
      foreach (object o in (IList)x)
      {
          result.Add(o);
      }
  }

引用返信 編集キー/
■63553 / inTopicNo.4)  Re[1]: object型の中身のlist展開
□投稿者/ 渋木宏明 (16回)-(2012/09/06(Thu) 14:00:38)
渋木宏明 さんの Web サイト
> objectがリスト型なのかどうかは
> if( x.GetType().GetGenericTypeDefinition() == typeof(List<>) ){

is 演算子を使いましょう。

また、「列挙できるかどうか」なら IEnumerable もしくは IEnumerable<T> であるかどうかを検査すれば十分です。

引用返信 編集キー/
■63554 / inTopicNo.5)  Re[2]: object型の中身のlist展開
□投稿者/ 渋木宏明 (17回)-(2012/09/06(Thu) 14:04:47)
渋木宏明 さんの Web サイト
> IList か IEnumerable にキャストして List<object> に詰め直した方が早いかな。

「列挙するだけ」で Add() や Remove() しないなら、IEnumrable のままでいいような。

ただし、列挙終了時に Dispose() が呼び出されることを期待している IEnumerable<T> の場合はマズいかもしれませんが。
引用返信 編集キー/
■63555 / inTopicNo.6)  Re[2]: object型の中身のlist展開
□投稿者/ 渋木宏明 (18回)-(2012/09/06(Thu) 17:20:14)
渋木宏明 さんの Web サイト
2012/09/06(Thu) 21:16:09 編集(投稿者)
No63553 (渋木宏明 さん) に返信
> is 演算子を使いましょう。

ごめんなさい、List<> に対して is は使えないみたいですね。

.NET Framework 4.0 以降では共変が使えるので、object 型として列挙できるだけでいいなら

var obj = (object)new List<string>();

var enumerable = obj as IEnumerable<object>;

if (enumerable != null)
{
  foreach(var item in enumerable)
  {
    // item に対する操作
  }
}

のように、簡潔に書くことができます。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -