c # Reflection - Найти общий тип коллекции - PullRequest
20 голосов
/ 01 апреля 2010

Я отражаю свойство 'Бла', его тип 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 ]

32 голосов
/ 01 апреля 2010

Вы захотите взглянуть на 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 [Т]
System.String

21 голосов
/ 01 апреля 2010

Вы ищете метод GetGenericTypeDefinition:

MessageBox.Show(pi.PropertyType.GetGenericTypeDefinition().ToString());
1 голос
/ 25 апреля 2015

У меня была похожая, но гораздо более сложная проблема ... Я хотел определить, назначается ли тип членам типа коллекции или членам типа массива динамически.

Итак, вот лучший способ динамического получения типа элемента коллекции или массива с проверкой, если тип добавляемого объекта назначается коллекции или членам типа массива:

        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");
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...