C# Как добавить значения всех переменных объекта в список? - PullRequest
0 голосов
/ 08 апреля 2020

У меня есть класс, который содержит несколько строк:

public class Headers
{
    public string FirstStaticColumn { get; set; }
    public string ItemFrom { get; set; }
    public string PinFrom { get; set; }
    public string TerminalFrom { get; set; }
    public string CableLabel { get; set; }
    public string WireLabel { get; set; }
    public string CrossSection { get; set; }
    public string ItemTo { get; set; }
    public string PinTo { get; set; }
    public string TerminalTo { get; set; }
    public string CableEndsleeve { get; set; }
    public string LengthMM { get; set; }
}

Теперь мне нужны все значения этих свойств и сохранить их в списке.

Есть ли способ быстрее, чем делать

Headers headers = new Headers(); /*Let's pretend that all Variables have a value now*/
List<string> list = new List<string>();

list.Add(headers.FirstStaticColumn);
list.Add(headers.ItemFrom);
list.Add(headers.PinFrom);
...

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Используя отражение, вы можете достичь его, как

Headers headers = new Headers(); /*Let's pretend that all Variables have a value now*/
List<string> list = new List<string>();
foreach (var item in headers.GetType().GetProperties())
{
  list.Add(item.GetValue(headers)?.ToString());
}

Да, у него будет снижение производительности, но таким образом его не нужно будет поддерживать, когда вы добавляете новое свойство в Headers class

1 голос
/ 08 апреля 2020

Существует незначительное улучшение скорости, если вы сделаете это вместо:

string[] array1 = new string[] { headers.FirstStaticColumn, headers.ItemFrom, headers.PinFrom };

С одной стороны, оно находится в Speed ​​Rant территории разницы. С другой стороны, если вы продолжаете добавлять в список, вы просто теряете ресурсы без точки, не оставаясь с массивом c.

Я не могу согласиться с комментаторы советуют для размышления. Отражение определенно медленнее и должно использоваться только как запасной вариант, а не как ваш первый выбор. Если написание кода невозможно (неизвестные типы ввода) или невозможно (слишком много типов ввода), я считаю его допустимым. Но в показанном случае? Я не вижу причин прибегать к размышлениям.

0 голосов
/ 08 апреля 2020

Вы могли бы сделать что-то подобное.

Это менее многословно? На самом деле, нет. Преимущество, которое я бы сказал, заключается в рефакторинге функциональности в самом классе, что может или не может быть желательным.

Я отредактировал имена свойств и рассчитал для краткости.

public class Headers
{
    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }

    public IEnumerable<string> GetPropertyValues()
    {
        yield return A;
        yield return B;
        yield return C;
    }
}

Я мог бы сделать это код менее многословный и «не требующий обслуживания» с помощью рефлексии, но я лично не согласился бы с компромиссом в производительности.

Но если вы хотите использовать рефлексию, это работает:

public class Headers
{
    //You can modify this to get certain properties if you want, like public only
    private static readonly PropertyInfo[] properties = typeof(Headers).GetProperties();

    public string A { get; set; }
    public string B { get; set; }
    public string C { get; set; }

    public IEnumerable<string> GetPropertyValues()
    {
        foreach (var prop in properties)
            yield return prop.GetValue(this)?.ToString();
    }
}

У других подходов к отражению есть небольшое преимущество, заключающееся в кэшировании массива PropertyInfo. Но опять же размышление медленное.

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