如何检测对象是否为类型泛型List并转换为所需类型?

时间:2011-05-11 13:11:37

标签: c# generics casting

我有一个将通用列表转换为字符串的扩展方法。

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

3 个答案:

答案 0 :(得分: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等。

答案 1 :(得分:2)

您可以针对IEnumerable对其进行编码,而不是使用IList&lt; T&gt;对扩展方法进行编码,而是将其编码:

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

答案 2 :(得分:0)

使用System.Type查看您的类型是否为数组(IsArray),以及它是否为泛型类型(IsGenericType)