2011-05-11 14 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等調用);然而:你不是使用的通用功能,所以刪除它們! (或有繼發非通用API):

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等)

2

相反編碼對IList的<牛逼>擴展方法,你可以反對的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'或調用方法 –

相關問題