1 Soalan: Cara generik untuk mengakses sifat kelas

soalan dicipta di Wed, May 8, 2019 12:00 AM

Saya telah cuba membaca nilai dari lembaran excel, memetakannya ke dataTable dan kemudian memetakan nilai kepada kelasnya dalam C # menggunakan refleksi. Tidak ada isu untuk ini

Saya mempunyai dua kelas - satu memberikan data ujian, dan satu lagi menyediakan logik untuk membaca fail tetap-lebar.

Apabila kedua-dua kelas mempunyai lebih banyak sifat, cara saya mengakses sifatnya entah bagaimana menduplikasi.

Berikut adalah kelas 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

Berikut ialah kelas untuk mengakses fail lebar tetap


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

Apabila TestData dan IncomingFields mempunyai lebih banyak sifat, kod yang memanggilnya menjadi kekacauan pendua yang besar. Adakah terdapat cara untuk mengurangkan kod tersebut kerana nama harta adalah sama?

Berikut adalah apa yang saya perlu lakukan bagi setiap harta benda.

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

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

Adakah terdapat pula untuk mengurangkan 2 jika keadaan, menjadi 1 blok kod dengan melakukan loop foreach? Saya tidak tahu bagaimana cara memanggil hartanah secara generik. adalah mungkin melakukan sesuatu seperti ini dalam c #

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

    
0
  1. Semak AutoMapper , ia boleh mengautomasikan sifat menyalin dari satu kelas yang lain.
    2019-05-08 16: 31: 59Z
  2. Dari konteks saya menganggap bahawa ini adalah kesilapan kesilapan: ModifyFixedWidthFile(_testData.Address, _field.Name.Address, _field.Name.Address). Adakah anda bermaksud mengulangi Address?
    2019-05-08 19: 49: 17Z
  3. @ ScottHannen Maaf, saya menetapkan pemetaan, anda betul.
    2019-05-08 20: 47: 19Z
1 Jawapan                              1                         

Nama saya untuk kaedah dan hujah adalah hampir tidak berguna di sini.

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);
}

Ini hanya memecahnya menjadi dua fungsi. Kaedah luar memilih hartanah string dari testData dan memilih hartanah FieldPosition dari fields. Ini adalah satu-satunya bahagian yang berubah. Kemudian ia memanggil kaedah dalaman ModifySomething yang bertindak pada nilai tersebut.

    
0
2019-05-08 21: 35: 11Z
  1. Terima kasih, saya cuba dan nampaknya lebih mudah dibaca kepada saya. Masih agak kemas tetapi ia bagus.
    2019-05-08 22: 22: 51Z
sumber diletakkan di sini