Создание списка C # <> - PullRequest
       53

Создание списка C # <>

1 голос
/ 16 марта 2011

У меня есть простая проблема, но я не могу найти ответы на нее.У меня есть класс со свойствами.Одно из этих свойств возвращает список.У меня есть метод, который циклически просматривает все свойства любого вида класса и создает TreeNode для этого класса (приложение журнала связи).Когда я сталкиваюсь со свойством, идентифицированным как List, я не знаю, как правильно привести свойство. GetValue.свойство.PropertyType известно, но что бы я ни пытался, я получаю ошибку компиляции или ошибку времени выполнения.

Вот что я пытаюсь сделать ...

foreach (PropertyInfo prop in props)
{
    if(prop.PropertyType.Namespace == "System.Collections.Generic")
    {
        List<object> oList = prop.GetValue(data, null);
        MessageBox.Show(oList.Count.ToString())
    }
}

ЕслиЯ поставил точку останова в строке GetValue, параметр prop знает, что это список элементов «myclass» с тремя элементами.Я просто не могу привести его к списку объектов (что было бы хорошо) или к списку реальных элементов «myclass», что было бы еще лучше.Как преобразовать возвращаемое значение PropertyInfo.GetValue (объект) в его список?

Ответы [ 3 ]

3 голосов
/ 16 марта 2011

Прежде всего, недостаточно (или вообще необходимо) проверить пространство имен. Вы можете проверить, является ли prop.PropertyType экземпляром ICollection (вы можете использовать IsAssignableFrom ). Я предлагаю ICollection, потому что вы, кажется, заботитесь только о графе.

Затем вы можете привести его к ICollection (неуниверсальному) и запустить Enumerable.Cast , например:

IEnumerable<MyClass> res = ((ICollection)prop.GetValue(data,null)).Cast<MyClass>();
MessageBox.Show(res.Count().ToString());

Преимущество перед преобразованием непосредственно в Список состоит в том, что это будет работать с любой коллекцией. Но если вам это не нужно, вы можете попробовать то, что предлагает другой ответ.

1 голос
/ 16 марта 2011

ты пробовал

prop.GetValue(data, null) as List<YourClass>;
0 голосов
/ 16 марта 2011

Полагаю, вы хотите контравариантности.

Вы пытаетесь это сделать?

List<object> list = (List<Product>)object;

List<object> и List<Product> не будут рассматриваться как один и тот же тип.

C # 4.0 ввел ковариацию и контравариацию для интерфейса и делегировать общие параметры, но в любом случае, IList<T> не имеет контравариантности.

По моему скромному мнению, я считаю, что вам нужно пересмотреть свой граф объектов!

PD: Просто закомментируйте, если вы хотите руководство для этого!

...