2011-06-17 55 views
0

如果我有一個對象如何使用反射來映射列表<objects>包括枚舉值

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

而且我有一個部分對象:

public class Part { 
    public string Engine {get;set;} 
    public string Tire {get;set;} 
    public decimal price {get;set;} 

} 

我該如何使用反射和Part上的每個屬性都與PartToModify中的枚舉相匹配,創建一個ew 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; 
} 

顯然,你得到的是什麼,我試圖做的,任何想法JIFF?不,這不是一個學校項目。整個「汽車」的例子是我提出的最接近實際對象的最接近的例子,因爲我不想寫出我試圖完成的任務,想要提供一個例子。

+0

我也不明白你在做什麼。 –

+0

我想根據屬性的名稱選擇一個枚舉值。我認爲鮑勃淡水河谷正是我所需要的。 – pghtech

回答

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); 
+0

我認爲這將做到這一點。 – pghtech

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)); 
發現是在枚舉所有名稱
+0

我仍然面臨的問題是,雖然我可以找到一個property.name ==枚舉值,我該如何轉向並選擇該枚舉,如PartToModify。 pghtech