如何使用反射来映射包含枚举值</objects>的列表<objects>

时间:2011-06-17 21:13:20

标签: c# reflection enums

如果我有一个对象

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;
 }

显然,你对我想要做的事情有什么想法,有什么想法吗?不,这不是一个学校项目。整个“汽车”示例是我对实际对象提出的最快的最接近的例子,因为我不想写出我想要完成的事情,想提供一个例子。

2 个答案:

答案 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.ParseEnum.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));