- PR -

ジェネリック型へのキャスト

投稿者投稿内容
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2008-08-14 13:19
もし、List<T> の T の部分を実行時に引数として指定できれば解決するということでしたら、MakeGenericMethod を使うという手段もありえるかなと思います。
全く観点は異なりますが、ご参考まで。

public static class CollectionUtility {

  // T があらかじめ分かっているのであればジェネリックメソッドを使用
  public static List<T> CastAs<T>( object list ) {
    return ( List<T> )list;
  }

  // 型パラメーター T を引数で指定して GetList<T> を呼び出し
  public static IList CastAsTypedList( Type itemType, object list ) {

    MethodInfo method = typeof( Test ).GetMethod( "CastAs"
      , BindingFlags.Static | BindingFlags.Public
    );

    MethodInfo genericMethod = method.MakeGenericMethod( itemType );

    // List<T> は IList を実装している
    return ( IList )( genericMethod.Invoke( null, new object[]{ list } ) );

  }

}
泥爺
会議室デビュー日: 2007/12/03
投稿数: 8
投稿日時: 2008-08-14 22:29
List<string>がList<object>として扱えない理由みたいなものを見つけたので貼っておきます。

ジェネリック型の分散
http://msdn.microsoft.com/ja-jp/library/ms228359(VS.80).aspx
masa
大ベテラン
会議室デビュー日: 2004/10/28
投稿数: 161
投稿日時: 2008-08-15 09:03
ジェネリックは実行時に動的に型が指定されているわけではありませんから、
汎用的な機能を実装しようとするとキャストでは対応しきれない状況がでてきます。
そういうときにはラッパーが解決の糸口になることが少なくありません。
LINQ にもラッパーメソッドがいくつか定義されていますよね。

また、PowerCollection というコレクションライブラリには、
拡張コレクションやラッパーが多数収録されています。
とくに Algorithm.cs に型変換ラッパーなどのユーティリティメソッドが多数あります。

http://www.codeplex.com/PowerCollections


どのような手段を使っても GetHoge を使う場面で何らかコーディングの修正が発生すると思うのですが、IList や IList<T> を返す別のメソッドを定義して、必要な箇所だけ置き換えるというのは難しいのでしょうか。

スキルアップ/キャリアアップ(JOB@IT)