我有一個ClassA包含 10 個欄位的串列,并在以下串列中填充了 100 條記錄。
List<ClassA> abc = new List<ClassA>();
我有另一個ClassB有 12 個欄位的類,其中 10 個欄位與 Class 相同,還有 2 個額外欄位,可以說是 harcoded ,field11即field12. ClassA 和 ClassB 的屬性名稱相同。
我已經嘗試回圈ClassA串列并在回圈內構建ClassB物件,并繼續添加到ClassB帶有 2 個額外列的串列中。但是有沒有更好的方法來實作這一點?
uj5u.com熱心網友回復:
你可以使用選擇:
var def = abc.Select(a => new ClassB{
field1 = a.field1,
field2 = a.field2,
....
field11 = default,
field12 = default,
}).ToList()
uj5u.com熱心網友回復:
是的,您可以使用自動映射庫。像AutoMapper或Mapster 他們可以通過屬性命名約定來映射你的物體。您還可以為每個映射設定特定規則。請在上述鏈接中查找檔案。
uj5u.com熱心網友回復:
有多種選擇。
- 使用反射。
- 使用一些映射器庫,例如AutoMapper
- 通過有一個建構式,
ClassB它接受一個實體ClassA作為引數,然后將引數物件的屬性復制到ClassB正在構造的物件。
通過反射,您不需要庫,也不需要更改ClassB. 您可以執行以下操作。您在描述中使用了“欄位”和“屬性”,我的示例適用于屬性。如果您實際使用的是欄位而不是屬性,請替換.GetProperties()為.GetFields(). 您可能還想重命名一些變數,例如classAFields代替classAProps等。通常,建議使用屬性而不是欄位。
var xyz = new List<ClassB>();
var classAProps = typeof(ClassA).GetProperties();
// Making a dictionary so that it is easily searchable using ClassA property names
var classBProps = typeof(ClassB).GetProperties()
.Where(x => classAProps.Select(t => t.Name).Contains(x.Name))
.ToDictionary(x => x.Name);
foreach (var a in abc) // abc is the list of ClassA
{
var b = new ClassB();
foreach (var propA in classAProps)
{
var propB = classBProps[propA.Name];
propB.SetValue(b, propA.GetValue(a));
}
// Set the other fields which are not common to both ClassA and ClassB
b.Prop11 = "Field11 value";
b.Prop12 = "Field12 value";
xyz.Add(b);
}
如果您確實只有 10 個常見欄位,正如您在問題中提到的那樣,您最好一個接一個地復制這些欄位,如本文的另一個答案中所述。這樣干凈多了。ClassA但是如果你在and之間有很多這樣的公共欄位ClassB,那么只有使用反射,因為只有 10 個欄位的代碼有點笨拙。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/427139.html
上一篇:LINQ比較時間跨度
