如果我有一个对象
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;}
}
如何使用反射?对于Part上与PartToModify中的枚举匹配的每个属性,创建一个新的UpdatePart对象并选择正确的枚举,其中PartToModify==Part.property,并将Part.property.的值分配给UpdatePart.NewValue
我想要一些:
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;
}
很明显,你对我想做的事很感兴趣,有什么想法吗?不,这不是学校的项目。整个"汽车"示例是我想出的最快、最接近实际对象的示例,因为我不想只写下我试图实现的目标,而是想提供一个示例。
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);
我不完全确定您在这里要做什么,但要通过枚举的字符串值找到它的值,可以使用Enum.Parse
或Enum.TryParse
。你可以这样做:
PartToModify result;
if (Enum.TryParse<PartToModify>("Engine", true, out result))
{
/* found a match. It's in result */
}
第二个true
参数告诉它忽略大小写。这样你就可以匹配所有的"引擎"、"引擎"one_answers"引擎"等等
您也可以反过来使用查找枚举中的所有名称
string[] myNames = Enum.GetNames(typeof(PartToModify));