Итерировать по словарю и использовать значение для итерации по классу C# - PullRequest
0 голосов
/ 18 июня 2020

В моем коде c# у меня есть итерация над Dictionary, и я хочу добиться чего-то подобного, используя Classes

MyModel othermodel = new MyModel();

Dictionary<string, string> mydictionary = new Dictionary<string, string>()
{
    {"n1", "Item"},
    {"n2", "Second"},
    {"n3", "Third"},
    {"n4", "Fourth"},
    {"n5", "Fith"},
    {"n6", "Sixth"},
    {"n7", "Seventh"},
    {"n8", "Eighth"},
    {"n9", "Ninth"},
    {"n0", "Tenth"},
    {"n11", "Eleventh"}

};

foreach (var dicitem in mydictionary.ToArray())
{
    foreach (MyModel.NewItem.(mydictionary[dicitem].Value) item in othermodel.(mydictionary[dicitem].Key))
    {
         ...
    }
}

Итак, мой результат будет:

first iteration:

foreach (MyModel.NewItem.Item item in othermodel.n1)
{
     ...
}

second iteration:

foreach (MyModel.NewItem.Second item in othermodel.n2)
{
     ...
}

...

Если есть способ сделать это, мы будем благодарны за любую помощь.

1 Ответ

0 голосов
/ 18 июня 2020

Доступ к свойствам объекта через его имена может быть выполнен с помощью Reflection, независимо от того, откуда эти имена (словарь, массив, ...) Небольшой пример здесь:

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

затем для доступа к свойству Name выполните:

var me = new Person {Name = "John", Age = 33};

var propertyName = "Name";
var propertyInfo = typeof(Person).GetProperty(propertyName);

var propertyValue = propertyInfo?.GetValue(me) as string;

Используя верхний код, вы создаете одно Propertynfo. Если вы хотите прочитать больше свойств одного и того же объекта, лучше прочитать все объекты PropertyInfo сразу:

var me = new Person {Name = "John", Age = 33};

var propertiesInfo = typeof(Person).GetProperties();

var propertyName = "Name";
var nameProperty = propertiesInfo
    .Single(p => p.Name == propertyName);
var name = nameProperty.GetValue(me) as string;


//faster approach
var age = (int)propertiesInfo
    .Single(p => p.Name == "Age")
    .GetValue(me);

Имейте в виду, что в этом примере я предполагаю, что свойство со спецификацией c имя существует, поэтому я просто позвонил Single. Однако в другой ситуации вам может потребоваться проверить наличие собственности перед тем, как получить к ней доступ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...