如何查找列表的成员类型

时间:2015-09-28 11:22:28

标签: c# list types

到目前为止,我有这个:

if (o.GetType().IsGenericType && o is System.Collections.IEnumerable)
        {
            var typefield = typeof(List<object>).GetFields().Where(f => f.Name == "T").ToArray();
            Type T = (Type)(typefield[0].GetValue(o));
            addButton.Enabled = true;
            if (((System.Collections.IList)o).Count > 0)
            {
                removeButton.Enabled = true;
            }
            comboBox1.Enabled = true;
            comboBox1.Items.Clear();

            foreach (var item in Assembly.GetAssembly(T).GetTypes().Where(x => T.IsAssignableFrom(x) && !x.IsAbstract))
            {
                comboBox1.Items.Add(item);
            }
            comboBox1.DisplayMember = "Name";   
        }

但它在线路上崩溃&#34;类型T =(类型)(typefield [0] .GetValue(o));&#34;因为数组是空的,这意味着前一行不起作用。

问题: 假设通过第一行的所有内容都是List,我该如何确定列表中的对象类型。 (请注意,检查成员的类型不够好。成员很可能是从列表定义中指定的类型派生的。)

P.S。 我在这里读到,我的第一行是确定列表的最佳方式: If object is Generic List 你有更准确的方法吗?

4 个答案:

答案 0 :(得分:0)

如果我理解正确,你可以通过

获得通用参数
Type.GetGenericArguments()

请参阅https://msdn.microsoft.com/en-us/library/system.type.getgenericarguments%28v=vs.110%29.aspx

答案 1 :(得分:0)

要确定List<T>的类型,您可以使用Type.GetGenericArguments()

var o = new List<int>();

if (o.GetType().IsGenericType && o is IList)
{
    var args = o.GetType().GetGenericArguments()

    if(args.Count() == 1)
    {
        Type T = args[0];

        // rest of code
    }
}

答案 2 :(得分:0)

您可以使用GetGenericArguments。此代码将为您提供列表o

中的元素类型
if (o.GetType().IsGenericType && o is System.Collections.IEnumerable)
{
    var itemType = o.GetType().GetGenericArguments()[0];
    //Console.WriteLine(itemType);
}

如果你有

var o = new List<string>{ "a", "b" };

它会给你

System.String;

答案 3 :(得分:0)

我认为一个答案可能是这种方法:

public IEnumerable<Type> GetGenericIEnumerables(object o) {
    return o.GetType()
            .GetInterfaces()
            .Where(t => t.IsGenericType == true
                && t.GetGenericTypeDefinition() == typeof(IEnumerable<>))
            .Select(t => t.GetGenericArguments()[0])
            .ToList();
}

你可以这样使用它:

var type= GetGenericIEnumerables(o).FirstOrDefault();

如果o不是IEnumerable<T>,则类型为null,否则返回T

如果o本身不是通用的,并且继承自IEnumerable<T>,例如对于string,该函数将返回char

基于jason's asnwer