c#Reflection - 查找集合的通用类型

时间:2010-04-01 14:26:21

标签: c# reflection properties types

我正在反映一个属性'Blah',其类型是ICollection

    public ICollection<string> Blah { get; set; }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        var pi = GetType().GetProperty("Blah");
        MessageBox.Show(pi.PropertyType.ToString());
    }

这给了我(正如你所期望的那样!)ICollection<string> ......

但实际上我想获得收集类型,即ICollection(而不是ICollection<string>) - 有人知道我该怎么做吗?

3 个答案:

答案 0 :(得分:32)

例如,您需要查看GetGenericTypeDefinition

   List<String> strings=new List<string>();


        Console.WriteLine(strings.GetType().GetGenericTypeDefinition());
        foreach (var t in strings.GetType().GetGenericArguments())
        {
            Console.WriteLine(t);

        }

这将输出:

  

System.Collections.Generic.List`1 [T]
  System.String

答案 1 :(得分:21)

您正在寻找GetGenericTypeDefinition方法:

MessageBox.Show(pi.PropertyType.GetGenericTypeDefinition().ToString());

答案 2 :(得分:1)

我有一个类似但更复杂的问题......我想确定一个类型是否可以动态分配给集合类型成员或数组类型成员。

因此,如果要添加的对象的类型可分配给集合或数组类型成员,这里有更好的方法如何动态获取成员类型的集合或数组:

        List<IComparable> main = new List<IComparable>() { "str", "řetězec" };
        IComparable[] main0 = new IComparable[] { "str", "řetězec" };
        IEnumerable collection = (IEnumerable)main;
        //IEnumerable collection = (IEnumerable)main0;
        string str = (string) main[0];
        if (collection.GetType().IsArray)
        {
            if (collection.GetType().GetElementType().IsAssignableFrom(str.GetType()))
            {
                MessageBox.Show("Type \"" + str.GetType() + "\" is ok!");
            }
            else
            {
                MessageBox.Show("Bad Collection Member Type");
            }
        }
        else
        {
            if (collection.GetType().GenericTypeArguments[0].IsAssignableFrom(str.GetType()))
            {
                MessageBox.Show("Type \"" + str.GetType() + "\" is ok!");
            }
            else
            {
                MessageBox.Show("Bad Collection Member Type");
            }
        }