c# Reflection - 查找集合的泛型类型

Posted

技术标签:

【中文标题】c# Reflection - 查找集合的泛型类型【英文标题】:c# Reflection - Find the Generic Type of a Collection 【发布时间】:2011-02-03 09:37:45 【问题描述】:

我正在反映一个属性“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&lt;string&gt; ...

但我真的想获得集合类型,即ICollection(而不是ICollection&lt;string&gt;)——有人知道我会怎么做吗?

【问题讨论】:

但是它的类型 ICollection&lt;string&gt;... 同意,ICollectionICollection&lt;T&gt; 是两种完全不同的类型。 【参考方案1】:

例如,您需要查看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 表示GetGenericArguments。这实际上就是我登陆这里时所寻找的。​​span> 【参考方案2】:

您正在寻找GetGenericTypeDefinition 方法:

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

【讨论】:

请注意,这将返回“ICollection`1[T]”,这是 CLR 对“ICollection”的说法。我会提出相同的建议,所以 +1。【参考方案3】:

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

因此,如果要添加的对象的类型可分配给集合或数组类型成员,那么这是如何通过验证动态获取集合或数组的成员类型的更好方法:

        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");
            
        

【讨论】:

以上是关于c# Reflection - 查找集合的泛型类型的主要内容,如果未能解决你的问题,请参考以下文章

C#泛型Dictionary的用法实例详解

C#泛型Dictionary的用法实例详解

在不知道类型是啥的情况下调用返回泛型集合的泛型方法? C#

C# 如何获取泛型集合 的数据

Java 泛型的作用及其基本概念

C#中的泛型是啥意思?