Список в списке PropertyInfo get properties iteration

У меня был список как ProductSpec {id, Name} и еще один список как Product {productspec, id, Name} . Когда я пытаюсь получить доступ к свойствам Продукта в

IList properties = typeof(Product).GetProperties().ToList();

Я возвращаю свой идентификатор и имя как свойство, которое прекрасно, но когда я пытаюсь повторить спецификацию продуктов,

foreach(var property in properties)
{
    IList properties = property.propertytype.getproperties();
   //I am not getting the productspec columns 
    //instead I am getting (capacity,count ) as my properties..
}

Итак, как я могу повторить список из списка, чтобы получить свойства списка

0
добавлено отредактировано
Просмотры: 1
de
Что это за property.propertytypr.getproperties() ?
добавлено автор V4Vendetta, источник
Не могли бы вы разместить определения классов Product и ProductSpec , чтобы помочь нам лучше ответить на вопрос?
добавлено автор jam40jeff, источник
В дальнейшем для других ссылок свойство ProductSpec в классе Product было определено как public List Spec {get; задавать; } за комментарий, указанный ниже.
добавлено автор jam40jeff, источник
Извините, я редактировал мой вопрос, он должен быть PropertyType
добавлено автор Bhuvan, источник

3 ответы

Вы должны использовать тот же код для типа свойства:

var innerProperties = property.PropertyType.GetProperties().ToList();

Также переименуйте результат - он конфликтует с переменной в цикле foreach .

3
добавлено
@Bhuvan, тогда вы получаете свойства какого-либо другого члена продукта, или свойство productspec не имеет типа, который вы ожидаете от него. Проверьте тип свойства productspec . Убедитесь, что это общедоступная собственность. Также установите точку останова и проверьте имя свойства, для которого вы получаете результаты.
добавлено автор Sergey Berezovskiy, источник
@Bhuvan извините, не понял. Вам нужно создать объект типа свойства?
добавлено автор Sergey Berezovskiy, источник
Этот ответ не дает ничего полезного для искателя, поскольку GetProperties() уже возвращает IList . Этот код будет вести себя так же, как код в исходном сообщении. Наверное, здесь что-то происходит. Я предполагаю, что свойство, которое ударяется, фактически является типом List , поскольку комментарий указывает, что перечисляемые свойства являются Capacity , Count и т. Д. ,
добавлено автор jam40jeff, источник
@ lazyberezovsky Я это проверил. Он не компилируется. Все, что вы сделали, было правильным его синтаксисом (имя переменной и определение дублирующейся переменной), чтобы скомпилировать ее. Я просто не чувствую, что этот ответ добавляет что-либо к обсуждению, поскольку его код будет по-прежнему вести себя одинаково даже с исправлениями (очевидно, что он был скомпилирован на основе его комментариев о результатах, которые он видел).
добавлено автор jam40jeff, источник
@ lazyberezovsky Это справедливо, но не могли бы вы объяснить, почему в комментариях? (Заметьте, я обычно не прошу об этом, потому что я считаю, что анонимность голосования должна быть защищена, но поскольку вы уже сказали мне, что это вы, я был бы признателен за ваши рассуждения.)
добавлено автор jam40jeff, источник
@ lazyberezovsky Пожалуйста, обсудите это под ответом, о котором идет речь ... Я отвечу туда.
добавлено автор jam40jeff, источник
Я пытаюсь установить значение для класса «ProductSpec», который находится в классе свойств как Type T = property.PropertyType; и Object obj = Activator.CreateInstance (T); Но когда я пытаюсь установить значение как property.SetValue (obj, row [item.Name], null); Я получаю сообщение об ошибке «Объект не соответствует целевому типу»
добавлено автор Bhuvan, источник
О, боже мой .. :) Мне очень жаль, что я не копировал свой код из редактора VS в Stack over flow editor. его типографская ошибка сделана мной, и я ее исправлю. Спасибо за драгоценный ответ: дело не в объекте «public ProductSpec Spec {get; set;}« Я создал список «public List Spec {get; set;}». Так что я испортил код, и я разместил здесь свой вопрос. Теперь я понял следующие ответы и ваши комментарии, где я ошибся
добавлено автор Bhuvan, источник
да, я создаю объект как Type T = property.PropertyType; и Object obj = Activator.CreateInstance (T); но я получаю erro, когда пытаюсь установить значение как property.SetValue (obj, row [item.Name], null); "объект не соответствует типу цели"
добавлено автор Bhuvan, источник
Как добавить элемент для этого свойства .. например, как добавить элемент в список, который является собственностью «Тип T = property.PropertyType;» как добавить элемент в тип списка T
добавлено автор Bhuvan, источник
вы правы ... я сошел с ума ... когда я увидел свой код через час спасибо
добавлено автор Bhuvan, источник
когда я делаю это, я не могу повторить идентификатор и имя спецификации продукта ... я исправляю некоторые другие свойства ,
добавлено автор Bhuvan, источник

Is the type of the ProductSpec in the Product class of type ProductSpec or of type List? If it is a list you could do the following:

var properties = new List();
foreach (var property in properties)
{
    if (typeof(IEnumerable).IsAssignableFrom(property.PropertyType)
        && property.PropertyType.IsGenericType
        && property.PropertyType.GetGenericArguments().Length == 1)
    {
        IList innerProperties = property.PropertyType.GetGenericArguments()[0].GetProperties();
        //should contain properties of elements in lists
    }
    else
    {
        IList innerProperties = property.PropertyType.GetProperties();
        //should contain properties of elements not in a list
    }
}
3
добавлено
«так как вопрос не дает понять» полностью согласен с вами, а также удаляет downvote
добавлено автор Sergey Berezovskiy, источник
@lazyberezovsky Однако, поскольку вопрос не дает ясности, я удалю ваш downvote и применим нисходящий вопрос к вопросу (который я удалю, если он уточнит или по крайней мере даст нам компилируемый код).
добавлено автор jam40jeff, источник
@lazyberezovsky В ответ на «Проблема была в неправильном коде (исправлена ​​в редактировании) и в имени переменной, которая противоречила переменной в foreach». Я уже признал, что исходный код содержит ошибки, которые могут привести к его компиляции. Тем не менее, в комментариях, спрашивающий указывает результаты, которые он видит, указывая, что он не вставлял фактический код, который он запускает (который компилируется). Эти результаты показывают, что его свойство может фактически иметь тип List , а не `ProductSpec '.
добавлено автор jam40jeff, источник
Привет, спасибо за ответ, я попробую сейчас
добавлено автор Bhuvan, источник

Попробуй это:

    PropertyInfo[] propertyInfos = typeof(Product).GetProperties();
        foreach (var propertyInfo in propertyInfos)
        {
            var inner = propertyInfo.PropertyType.GetProperties().ToList();
        }

public class Product
{
    public ProductSpec Spec { get; set; }

    public string Id { get; set; }

    public string Name { get; set; }
}

public class  ProductSpec
{
    public string Id { get; set; }

    public string Name { get; set; }
}
0
добавлено