【问题标题】:How to detect if an object is of type generic List and cast to the required type?如何检测对象是否为泛型 List 类型并转换为所需类型?
【发布时间】:2011-05-11 13:11:36
【问题描述】:

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

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&lt;string&gt;List&lt;int&gt;List&lt;ComplexType&gt; 任何类型的列表。

有没有一种方法可以检测到这个对象是一个泛型列表并因此转换为该特定的泛型列表类型来调用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();
}

【问题讨论】:

    标签: c# generics casting


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以根据 IEnumerable 对扩展方法进行编码,而不是针对 IList 编写扩展方法,那么它将是:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 列表不是数组;这也无助于 OP 找到 T 或调用方法
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多