如果我有一个对象
public class Car {
public List<UpdatePart> updatePartList {get; set;}
}
public class UpdatePart {
public PartToModify PartToModify {get; set;}
public string NewValue {get;set}
}
PartToModify是一个枚举:
public enum PartToModify {
Engine,
Tire,
}
我有一个Part对象:
public class Part {
public string Engine {get;set;}
public string Tire {get;set;}
public decimal price {get;set;}
}
如何使用反射以及PartToModify中与枚举匹配的Part上的每个属性,创建一个新的UpdatePart对象并在PartToModify == Part.Property中选择正确的枚举,并为UpdatePart.NewValue指定Part.Property的值
我会这样:
var partProperties = partObj.GetType().GetProperties();
foreach (var property on updatePartProperties) {
UpdatePartList.Add(MapProperties(partProperties, part));
}
public UpdatePart MapProperties(PropertyInfo partProperties, Part partObj){
//pseudo code
var updatePart = new UpdatePart();
foreach(var property on partProperties) {
if (property.Name == <iterate through enum values until one is found>)
updatePart.PartToModify = PartToModify.<somehow select value that matches property.name>
updatePart.NewValue = property.GetValue(partObj, null);
}
return updatePart;
}
显然,你对我想要做的事情有什么想法,有什么想法吗?不,这不是一个学校项目。整个“汽车”示例是我对实际对象提出的最快的最接近的例子,因为我不想写出我想要完成的事情,想提供一个例子。
答案 0 :(得分:2)
var partNames=Enum.GetNames(typeof(PartToModify));
var parts = from pi in partObj.GetType.GetProperties()
where partNames.Contains(pi.Name)
select new UpdatePart {
PartToModify = (partToModify)Enum.Parse(typeof(PartToModify),pi.Name),
NewValue=pi.GetValue(partObj,null)
};
foreach (var part in parts) UpdateList.Add(part);
答案 1 :(得分:1)
我不完全确定你在这里要做什么,但是要通过它的字符串值找到枚举值,你可以使用Enum.Parse
或Enum.TryParse
。
你可以这样做:
PartToModify result;
if (Enum.TryParse<PartToModify>("Engine", true, out result))
{
/* found a match. It's in result */
}
第二个true
参数告诉它忽略大小写。所以你可以匹配所有“引擎”,“引擎”,“引擎”等。
您也可以反过来使用
找到枚举中的所有名称string[] myNames = Enum.GetNames(typeof(PartToModify));