将未知类型的列表转换为通用列表类型

时间:2014-02-20 17:35:17

标签: c# list casting

我正在处理很多FieldInfo信息,我想为某些类型的数据添加异常以便以不同的方式处理它们(为了创建一个整洁的输出字符串)但我找不到将对象强制转换为List的方法所以我可以从中得到数据。

我的代码:

string str = "";
string value = "";

foreach (FieldInfo fieldInfo in fieldInfos)
{
    if (fieldInfo.Name == "Sprite" || fieldInfo.Name == "Background")
    {
        value = "Unreadable";
    }
    else if (fieldInfo.GetValue(type) == null)
    {
        value = "Null";
    }
    else
    {
        switch (fieldInfo.GetValue(type).GetType().Name)
        {
            default:
                value = fieldInfo.GetValue(type).ToString();
                break;
            case "Color":
                value = ((Color)fieldInfo.GetValue(type)).Name;
                break;
            case "List`1":
                value = (((System.Collections.Generic.List<>)fieldInfo.GetValue(type)).Count - 1).ToString();
                break;
        }
    }

    str += "        " + fieldInfo.Name + ": " + value + Environment.NewLine;
}
return str;

2 个答案:

答案 0 :(得分:4)

将其转换为非通用ICollection

(((System.Collections.ICollection)fieldInfo.GetValue(type)).Count - 1).ToString();

它可以让您访问Count属性。

答案 1 :(得分:1)

如果您只是在项目数量之后,那么只需使用IList也实现的非通用List<>

case "List`1":
  value = (((System.Collections.IList)fieldInfo.GetValue(type)).Count - 1).ToString();
  break;

您可以通过将default子句更改为此来支持任何容器来增加一些灵活性:

default:
 if (typeof(System.Collections.ICollection).IsAssignableFrom(fieldInfo.GetValue(type).GetType())
   value = (((System.Collections.ICollection)fieldInfo.GetValue(type)).Count - 1).ToString();
  else
    value = fieldInfo.GetValue(type).ToString();
  break;

现在,您将处理Dictionary<>LinkedList<>以及List<>

等集合