2008-11-15 204 views
0

我想知道如何獲取方法參數值來自的屬性的名稱。下面的代碼片段顯示了我想做的事:獲取值來自的屬性名稱

Person peep = new Person(); 
Dictionary<object, string> mapping = new Dictionary<object, string>(); 
mapping[peep.FirstName] = "Name"; 
Dictionary<string, string> propertyToStringMapping = Convert(mapping); 
if (mapping[peep.FirstName] == propertyToStringMapping["FirstName"]) 
    Console.WriteLine("This is my desired result"); 

private Dictionary<string, string> Convert(Dictionary<object, string> mapping) 
{ 
    Dictionary<string, string> stringMapping = new Dictionary<string, string>(); 
    foreach (KeyValuePair<object, string> kvp in mapping) 
    { 
    //propertyName should eqal "FirstName" 
    string propertyName = kvp.Key?????? 
    stringMapping[propertyName] = kvp.Value; 
    } 
    return stringMapping; 
} 

回答

0

我認爲最終您需要存儲與該屬性關聯的PropertyInfo對象,或者存儲映射對象中屬性名稱的字符串表示形式。語法您有:

mapping[peep.FirstName] = "Name"; 

將創建一個字典,等於peep.FirstName財產的價值的關鍵值的條目,值等於「名稱」。

如果存儲屬性名稱一樣的字符串:

mapping["FirstName"] = "Name"; 

然後,您可以使用反射來得到你的對象的「名字」屬性。但是,您必須將「peep」對象傳遞給Convert函數。這似乎與你想要做的有些相反。

您可能還可以得到瘋狂的表現形式和做類似:

var mapping = new Dictionary<Expression<Action<T>>,string>(); 
mapping[ p => p.FirstName ] = "Name"; 

然後在你的轉換功能,你可以檢查的表達。它看起來像這樣:

private Dictionary<string,string> Convert(Dictionary<Expression<Action<T>>,string> mapping) 
{ 
    var result = new Dictionary<string,string>(); 
    foreach(var item in mapping) 
    { 
     LambdaExpression ex = item.Key as LambdaExpression; 
     string propertyName = ((MemberExpression)ex.Body).Member.Name; 
     string propertyValue = item.Value; 
     result.Add(propertyName,proeprtyValue); 
    } 
    return result; 
} 

這是或多或少的我的頭頂,所以我可能有一些表情類型。如果這個實現有問題,請告訴我,我會看看我是否可以制定一個功能性示例。

1

你不能這樣做,因爲它的工作方式是,C#通過調用get訪問和傳球評估名字屬性的值它的值到字典的索引器。因此,您發現FirstName值的方式完全丟失。就像你評估2 + 2的方式一樣。 如果你寫「x = 2 + 2」,x的值將是4,但是無法判斷它是3 + 1還是2 + 2或5 + (-1)或...評估爲4.

0

我對C#不太瞭解,但我想peep是枚舉嗎?至於Java,你可以這樣做:

String propertyName = kvp.key.toString() 

也許在C#中有類似的東西?

即使窺視不是一個枚舉:我看不出爲什麼鍵應該是一個任意的對象沒有理由?所以也許解決方案就是使用枚舉作爲鍵的類型?

此外,我不知道你想做什麼,但通常,我不建議你將枚舉鍵轉換爲字符串。你可以用一個字符串做什麼,你也不能用enum做什麼?