如何检测对象是否属于泛型 List 类型并强制转换为所需类型

本文关键字:类型 转换 List 泛型 何检测 检测 属于 是否 对象 | 更新日期: 2023-09-27 17:56:21

我有一个扩展方法,用于将泛型列表转换为字符串。

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

如何检测对象是否属于泛型 List 类型并强制转换为所需类型

您可以通过大量反射来实现这一点(既要找到正确的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等)

与其针对 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();
}

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