我有 2 個這樣的模型
public class ModelA
{
public string Name{get;set;}
public string Value{get;set;}
}
public class B
{
public List<ModelA>Items{get;set;}
}
下面的輸入將被反序列化到B 類
{
"Items":[
{
"Name":"Food Name"
"Value":"Fries"
},
{
"Name":"Weapon Name"
"Value":"Gun"
},
{
"Name":"Vehicle Name"
"Value":"Car"
}
]
}
我還有第三個模型,如下所示
public class ModelValues
{
public string FoodName{get;set;}
public string WeaponName{get;set;}
public string VehicleName{get;set;}
}
我想將模型 A的相應值添加到ModelValues類中,例如FoodName屬性的值應為 Fries。是否有任何簡單的方法可以將該類 A的值分配給ModelValues。我知道我們可以使用類似的東西
public void AssignValues(B products)
{
ModelValues values=new ModelValues();
values.FoodName=products.Find(x=>x.Name=="Food Name").Value;
values.WeaponName=products.Find(x=>x.Name=="Weapon Name").Value;
}
在實際實作中,由于ModelValues 中的專案和輸入會很大,我想避免這種逐行分配值。有什么方法可以只用幾行代碼來完成這項作業
uj5u.com熱心網友回復:
Newtonsoft.Json 用法的另一種變體:
public class ModelValues
{
[JsonProperty("Food Name")]
public string FoodName { get; set; }
[JsonProperty("Weapon Name")]
public string WeaponName { get; set; }
[JsonProperty("Vehicle Name")]
public string VehicleName { get; set; }
}
var items = JsonConvert.DeserializeObject<B>(json)
.Items
.ToDictionary(x => x.Name, x => x.Value);
JObject obj = JObject.FromObject(items);
var values = obj.ToObject<ModelValues>();
或者不更改 ModelValues:
var items = JsonConvert.DeserializeObject<B>(json)
.Items
.ToDictionary(x => x.Name.Replace(" ", ""), x => x.Value);
JObject obj = JObject.FromObject(items);
var values = obj.ToObject<ModelValues>();
uj5u.com熱心網友回復:
我會質疑你目前的方法。當您最終可以添加任意數量的屬性時,集合可能是更好的選擇。也許甚至是一本字典。
但是,以下方法將以您想要的方式復制值。這不是執行此操作的最快方法。但即使您添加其他名稱和屬性,它也會繼續作業。
void Convert(B items, ModelValues values)
{
Type type = typeof(ModelValues);
foreach (ModelA item in items.Items)
{
string name = item.Name.Replace(" ", string.Empty);
PropertyInfo info = type.GetProperty(name, BindingFlags.Instance | BindingFlags.Public);
if (info != null)
info.SetValue(values, item.Value);
}
}
uj5u.com熱心網友回復:
您的代碼進行了 3 次串列迭代。這個代碼只有一個
var items = Newtonsoft.Json.JsonConvert.DeserializeObject<B>(json);
var values = AssignValues(items);
public ModelValues AssignValues(B products)
{
ModelValues values = new ModelValues();
foreach (var item in products.Items)
{
if (item.Name == "Food Name") values.FoodName = item.Value;
else if (item.Name == "Weapon Name") values.WeaponName = item.Value;
else values.VehicleName = item.Value;
}
return values;
}
我認為這不是一個好主意,但是您可以使用反射來做同樣的事情
public ModelValues AssignValues(B products)
{
var dict=products.Items.ToDictionary(i => i.Name, i=> i.Value );
var values = new ModelValues();
var properties = values.GetType().GetProperties();
foreach (var prop in properties)
{
var nameIndex=prop.Name.LastIndexOf("Name");
var name= prop.Name[0..nameIndex] " Name";
prop.SetValue(values,dict[name] );
}
return values;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/393514.html
