2011-05-11 11 views
7

一般的なリストを文字列に変換する拡張メソッドがあります。オブジェクトがジェネリックリストの型であるかどうかを検出し、必要な型にキャストする方法?

public static string ConvertToString<T>(this IList<T> list) 
{ 
    StringBuilder sb = new StringBuilder(); 
    foreach (T item in list) 
    { 
     sb.Append(item.ToString()); 
    } 
    return sb.ToString(); 
} 

私は、リストを保持するオブジェクト型のオブジェクトを持っています。リストはList<string>List<int>List<ComplexType>のいずれのタイプのリストであってもよい。

このオブジェクトが汎用リストであることを検出できるため、特定の汎用リストタイプにキャストしてConvertToStringメソッドを呼び出す方法はありますか?

//ignore whats happening here 
//just need to know its an object which is actually a list 
object o = new List<int>() { 1, 2, 3, 4, 5 }; 

if (o is of type list) 
{ 
    string value = (cast o to generic type).ConvertToString(); 
} 

答えて

6

あなた(両方とも正しいTを見つけるために、その後、MakeGenericMethodなどを経由して呼び出すために)反射の多くと、それを達成することができます。しかし、あなたはを使用していませんを使用しているので、それらを削除してください!

public static string ConvertToString(this IEnumerable list) 
{ 
    StringBuilder sb = new StringBuilder(); 
    foreach (object item in list) 
    { 
     sb.Append(item.ToString()); 
    } 
    return sb.ToString(); 
} 

IList list = o as IList; 
if (list != null) 
{ 
    string value = list.ConvertToString(); 
} 

(あなたはまた、上記の手順でIEnumerableを使用することができますが、しかし、あなたはそれを行う場合stringなどに注意する必要があります(または二次非ジェネリックAPIを持っています)代わりに、IListを<T>に対する拡張メソッドをコーディングする)

2

、あなたがIEnumerableをに対してそれをコーディングすることができ、それはなるだろう:

public static string ConvertToString(this IEnumerable list) 
{ 
    StringBuilder sb = new StringBuilder(); 
    foreach (object item in list) 
    { 
     sb.Append(item.ToString()); 
    } 
    return sb.ToString(); 
} 

oがIEnumerableをされている場合、あなたがチェックすることができ:

object o = new List<int>() { 1, 2, 3, 4, 5 }; 

if (o is IEnumerable) 
{ 
    string value = ((IEnumerable) o).ConvertToString(); 
} 
0

使用System.Typeをあなたのタイプはarrat(でIsArray)であれば、それはジェネリック型(IsGenericType)

+0

リストだかどうかを確認するために配列ではありません。 OPが 'T'を見つけたり、メソッドを呼び出すのにも役立ちません –

関連する問題