Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#反射-查找集合的泛型类型_C#_Reflection_Properties_Types - Fatal编程技术网

c#反射-查找集合的泛型类型

c#反射-查找集合的泛型类型,c#,reflection,properties,types,C#,Reflection,Properties,Types,我反映了一个属性“废话”,它的类型是ICollection public ICollection<string> Blah { get; set; } private void button1_Click(object sender, RoutedEventArgs e) { var pi = GetType().GetProperty("Blah"); MessageBox.Show(pi.PropertyType.ToSt

我反映了一个属性“废话”,它的类型是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());
    }
public ICollection Blah{get;set;}
私有无效按钮1\u单击(对象发送者,路由目标)
{
var pi=GetType().GetProperty(“Blah”);
Show(pi.PropertyType.ToString());
}
这给了我(正如你所期望的!)
i收集

但我真的想得到收集类型,即
ICollection
(而不是
ICollection
)-有人知道我该怎么做吗

您将需要查看以下示例:

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


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

        }
List strings=newlist();
Console.WriteLine(strings.GetType().GetGenericTypeDefinition());
foreach(字符串中的var t.GetType().GetGenericArguments())
{
控制台写入线(t);
}
这将输出:

System.Collections.Generic.List`1[T]
系统字符串


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

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

        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");
            }
        }
List main=newlist(){“str”,“řetězec”};
IComparable[]main0=新的IComparable[]{“str”,“řetězec”};
IEnumerable集合=(IEnumerable)main;
//IEnumerable集合=(IEnumerable)main0;
string str=(string)main[0];
if(collection.GetType().IsArray)
{
if(collection.GetType().GetElementType().IsAssignableFrom(str.GetType()))
{
Show(“Type\”+str.GetType()+“\”是可以的!”;
}
其他的
{
MessageBox.Show(“错误的集合成员类型”);
}
}
其他的
{
if(collection.GetType().GenericTypeArguments[0].IsAssignableFrom(str.GetType()))
{
Show(“Type\”+str.GetType()+“\”是可以的!”;
}
其他的
{
MessageBox.Show(“错误的集合成员类型”);
}
}

但其类型是
ICollection
…同意,
ICollection
ICollection
是两种完全不同的类型。请注意,这将返回“ICollection`1[T]”,即CLR表示“ICollection”。我也会提出同样的建议,所以对于
getgenericalarguments
来说+1.+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");
            }
        }