1 Вопрос: Общий способ доступа к свойствам класса

вопрос создан в Wed, May 8, 2019 12:00 AM

Я пытался прочитать значение из листа Excel, отобразить его в dataTable, а затем отобразить значение в его класс в C #, используя отражение. Нет проблем для этого

У меня есть два класса - один предоставляет тестовые данные, а другой - логику для чтения файла фиксированной ширины.

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

Вот класс TestData ​​p>

class TestData
{
     public string TestName { get; set; }
     public string Name{ get; set; }
     public string Address{ get; set; }
}

//ignoring the whole logic in the middle, i can access the value of the test by
_testData.Name or _testData.Address

Вот класс для доступа к файлу с фиксированной шириной


class FieldPosition
{
     public string FieldName { get; set; }
     public string PosStart{ get; set; }
     public string PosEnd{ get; set; }
}

class IncomingFields
{
     public FieldPosition Name => GetValue("Name");
     public FieldPosition Address=> GetValue("Address");
}
//ignoring the whole logic in the middle, i can access the value of the field position by
_field.Name.PosStart or _field.Name.PosEnd

Когда TestData и IncomingFields имеют больше свойств, код для их вызова становится большим дублирующим беспорядком. Есть ли способ уменьшить код, поскольку имя свойства совпадает?

Вот что я должен сделать для каждого свойства.

if (_testData.Name != "")
{
    ModifyFixedWidthFile(_testData.Name, _field.Name.PosStart, _field.Name.PosEnd)
}

if (_testData.Address!= "")
{
    ModifyFixedWidthFile(_testData.Address, _field.Address.PosStart, _field.Address.PosEnd)
}

Можно ли в любом случае сократить число 2 if в 1 блок кода, выполнив цикл foreach? Я просто не знаю, как назвать свойства в общем виде. Можно ли сделать что-то подобное в C #

if (_testData.[something generic]!= "")
{
    ModifyFixedWidthFile(_testData.[something generic], _field.[something generic].PosStart, _field.[something generic].PosEnd)
}

    
0
  1. Ознакомьтесь с AutoMapper , он может автоматизировать копирование свойств из один класс другому.
    2019-05-08 16: 31: 59Z
  2. Из контекста я предполагаю, что это опечатка: ModifyFixedWidthFile(_testData.Address, _field.Name.Address, _field.Name.Address). Вы хотели повторить Address?
    2019-05-08 19: 49: 17Z
  3. @ ScottHannen Извините, я исправил сопоставление, вы правы.
    2019-05-08 20: 47: 19Z
1 ответ                              1                         

Мои имена для методов и аргументов здесь почти бесполезны.

void OuterMethod(TestData testData, IncomingFields fields)
{
    ModifySomething(testData.Address, fields.Address);
    ModifySomething(testData.Name, fields.Name);
}

void ModifySomething(string value, FieldPosition fieldPosition)
{
    if (value != "")
        ModifyFixedWithFile(value, fieldPosition.PosStart, fieldPosition.PosEnd);
}

Это просто разбивает его на две функции. Внешний метод выбирает свойство string из testData и выбирает свойство FieldPosition из fields. Это единственные детали, которые изменяются. Затем он вызывает внутренний метод ModifySomething, который воздействует на эти значения.

    
0
2019-05-08 21: 35: 11Z
  1. Спасибо, я попытался, и это кажется мне более читабельным. Все еще немного грязно, но это хорошо.
    2019-05-08 22: 22: 51Z
источник размещен Вот