2011-05-11 27 views
7

Ho un metodo di estensione per convertire una lista generica in stringa.Come rilevare se un oggetto è di tipo generico Elenco e trasmettere al tipo richiesto?

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(); 
} 

Ho un oggetto che è di tipo oggetto che contiene una lista; l'elenco potrebbe essere List<string>, List<int>, List<ComplexType> qualsiasi tipo di elenco.

Esiste un modo per rilevare che questo oggetto è un elenco generico e quindi inoltrato a quel tipo di elenco generico specifico per chiamare il metodo 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(); 
} 

risposta

6

È può tal fine, con un sacco di riflessione (sia per trovare il corretto T, e quindi per invocare tramite MakeGenericMethod, ecc); tuttavia: non sei utilizzando le caratteristiche generiche, quindi rimuovile! (O di avere un API non generica secondario):

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

e

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

(è anche possibile utilizzare IEnumerable nel passaggio precedente, ma è necessario fare attenzione con string ecc se lo fai)

2

Invece di codificare il metodo di estensione contro IList <T>, è possibile codificare contro IEnumerable, allora sarebbe:

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

Poi si potrebbe verificare se o è un IEnumerable:

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

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

Usa System.Type per vedere se il tipo è un arrat (IsArray) e se è un tipo generico (IsGenericType)

+0

un elenco non è un array; anche questo non aiuta l'OP a trovare il 'T' o ad invocare il metodo –

Problemi correlati