2011-05-11 12 views
7

Tengo un método de extensión para convertir una lista genérica en cadena.¿Cómo detectar si un objeto es de tipo genérico Listar y convertir al tipo requerido?

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

Tengo un objeto que es del tipo objeto que contiene una lista; la lista podría ser List<string>, List<int>, List<ComplexType> cualquier tipo de lista.

¿Hay alguna manera de detectar que este objeto es una lista genérica y, por lo tanto, convertirlo a ese tipo de lista genérico específico para llamar al método 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(); 
} 

Respuesta

6

Usted puede lograr que, con una gran cantidad de reflexión (tanto para encontrar la correcta T, y después de invocar a través de MakeGenericMethod etc); sin embargo: usted no es usando las características genéricas, ¡entonces quítelos! (O tener una API no genérico secundario):

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

y

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

(también se puede utilizar IEnumerable en el paso anterior, pero hay que tener cuidado con string etc si lo hace)

2

En lugar de codificar el método de extensión contra IList <T>, podría codificar contra IEnumerable, entonces sería:

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

A continuación, se puede comprobar si o es un IEnumerable:

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

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

Uso System.Type para ver si su tipo es un arrat (IsArray) y si se trata de un tipo genérico (IsGenericType)

+0

una lista no es una matriz; eso tampoco ayuda al OP a encontrar el 'T' o invocar el método –

Cuestiones relacionadas