将类中的值存储/还原到属性名称和值列表/从属性名称和值列表中还原值
本文关键字:列表 还原 从属性 存储 属性 | 更新日期: 2023-09-27 17:48:55
我不确定最好和最简单的方法是什么,所以任何建议都值得赞赏。
我想获取任何/所有/单个域实体类上的所有字段,并在调用特定方法时动态添加前缀/删除前缀。
例如,我有以下实体:
public class Shop
{
public string TypeOfShop{get;set}
public string OwnerName {get;set}
public string Address {get;set}
}
public class Garage
{
public string Company {get;set}
public string Name {get;set}
public string Address {get;set}
}
等等...
我想获取带有前缀的属性列表:
public Class Simple
{
public class Prop
{
public string Name{get;set;}
public string Value{get;set;}
}
public ICollection list = new List<Prop>();
//set all prop
public void GetPropertiesWithPrefix(Garage mygarage, string prefix)
{
list.Add(new Prop{Name = prefix + "_Company", Value = mygarage.Company});
//so on... upto 50 props...
}
}
//to get this list I can simple call the list property on the Simple class
读取每个字段时,我使用 switch 语句并设置值。
//Note I return a collection of Prop that have new values set within the view,lets say
//this is a result returned from a controller with the existing prop names and new values...
public MyGarage SetValuesForGarage(MyGarage mygarage, string prefix, ICollection<Prop> _props)
{
foreach (var item in _prop)
{
switch(item.Name)
{
case prefix + "Company":
mygarage.Company = item.Value;
break;
//so on for each property...
}
}
}
有没有更好、更简单或更优雅的方式来使用 linq 或其他方式执行此操作?
您可以将道具存储在字典中,然后拥有:
mygarage.Company = _props[prefix + "_Company"];
mygarage.Address = _props[prefix + "_Address"];
//And so on...
在您的SetValuesForGarage
方法中,而不是内部带有switch
的循环。
编辑
有关使用Dictionary
的详细信息,请参阅 MSDN。
您可以定义如下list
:
Dictionary<string, string> list = new Dictionary<string, string>();
并在您的GetPropertiesWithPrefix
方法中具有类似于以下内容的内容:
list.Add(prefix + "_Company", mygarage.Company);
list.Add(prefix + "_Address", mygarage.Address);
//And so on...
这将消除您的Prop
类。
也许以下方法适合您。它接受任何对象,查找其属性并返回包含 Prop 对象的列表,每个对象对应于每个属性。
public class PropertyReader
{
public static List<Prop> GetPropertiesWithPrefix(object obj, string prefix)
{
if (obj == null)
{
return new List<Prop>();
}
var allProps = from propInfo
in obj.GetType().GetProperties()
select new Prop()
{
Name = prefix + propInfo.Name,
Value = propInfo.GetValue(obj, null) as string
};
return allProps.ToList();
}
}