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

Dav*_*vid 7 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();
}
Run Code Online (Sandbox Code Playgroud)

我有一个对象,它是一个包含列表的对象类型; 这个名单可以是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();
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 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();
}
Run Code Online (Sandbox Code Playgroud)

IList list = o as IList;
if (list != null)
{
    string value = list.ConvertToString();
}
Run Code Online (Sandbox Code Playgroud)

(您也可以IEnumerable在上面的步骤中使用,但string如果您这样做,则需要小心等)