В C # обычно получают значение свойства в объекте List - PullRequest
0 голосов
/ 25 октября 2018

У меня есть объект Match, структурированный как,

class Match
{
    public string location { get; set; }
    public List<Team> teams { get; set; }
    public Match()
    {
        location = "Wembley";
        teams = new List<Team>();
        teams.Add(new Team("Arsenal"));
        teams.Add(new Team("Burnley"));
    }
}
public class Team
{
    public string name { get; set; }
    public int score { get; set; }
    public Team(string title)
    {
        name = title;
        score = 0;
    }
}

Я использую вспомогательный класс для получения значения,

public static class Helper
    {
        public static object GetPropertyValue(this object T, string PropName)
        {
            return T.GetType().GetProperty(PropName) == null ? null :  T.GetType().GetProperty(PropName).GetValue(T, null);
        }
    }

Я планирую разрешить пользователю устанавливать значения с помощьюнапример, введите их в графическом интерфейсе как «match.team [1] .name», а затем разделите его на вызов параметра, например, в этом коде;это может идти вниз на несколько слоев.Здесь мы идем вниз по слою, чтобы получить значение свойства от члена списка,

int teamNo = 1;
MessageBox.Show(GetSubProperty(match, "teams", teamNo, "name")); 

Моя процедура такова:

    private string GetSubProperty(object obj, string prop1, int whichItem,  string prop2)
    {
        var o = obj.GetPropertyValue(prop1);
        object subObject = ((List<Team>)o)[whichItem];
        return subObject.GetPropertyValue(prop2).ToString();
    }

При получении свойства в одной из КомандыОбъекты списка, я должен привести значение к списку перед доступом к отдельному элементу в списке.Я хотел знать, как я мог бы сделать это в общем случае для любого отправляемого типа объекта. Я пробовал List и ArrayList и ряд других вариантов, но получаю ошибку «Невозможно привести объект типа» System.Collections.Generic.List 1[quickTest.Classes.Team]' to type 'System.Collections.Generic.List 1 [System.Object] "

1 Ответ

0 голосов
/ 26 октября 2018

Используйте IEnumerable.Кажется, это работает:

private string GetSubProperty(object obj, string prop1, int whichItem, string prop2)
{
    var o = obj.GetPropertyValue(prop1);

    int count = 0;
    foreach (object subObject in (IEnumerable)o)
    {
        if (whichItem == count++)
        {
            return subObject.GetPropertyValue(prop2).ToString();
        }
    }

    return null;
}

Конечно, убедитесь, что этот каст работает.Вы можете сделать свое решение более универсальным, пытаясь привести его к разным вещам и выполнив соответствующий код, основанный на типе o.

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