不確定這是否可能,但有沒有辦法實現這一點?C# - >將類的所有屬性轉儲到字典
給出這個類:
class A
{
public String B {get;set;}
public String C {get;set;}
public String D {get;set;}
}
實例化並分配V1,V2,V3,以B,C,d分別
我希望一個字典\矩陣\含有一些其它結構
B:V1
C:V2
D:V3
最好不使用第三方庫
不確定這是否可能,但有沒有辦法實現這一點?C# - >將類的所有屬性轉儲到字典
給出這個類:
class A
{
public String B {get;set;}
public String C {get;set;}
public String D {get;set;}
}
實例化並分配V1,V2,V3,以B,C,d分別
我希望一個字典\矩陣\含有一些其它結構
B:V1
C:V2
D:V3
最好不使用第三方庫
字段和它的值(公田)簡單的例子:
var a = new A("a", "b", "c");
var fields = typeof(A).GetFields();
var dict = new Dictionary<string, string>(fields.Length);
foreach (var fieldInfo in fields)
{
dict.Add(fieldInfo.Name, (string)fieldInfo.GetValue(a));
}
var a = new A{B = "V1", C = "V2", D = "V3"};
var dictionary = a.GetType()
.GetProperties()
.ToDictionary(prop => prop.Name,
prop => prop.GetValue(a));
由於某些原因,字典沒有得到填充。任何想法爲什麼? ideone說Getvalue沒有一個參數,我的VS並沒有給出任何錯誤,但字典只是空的http://ideone.com/umLgvr – Akash
var props = typeof(A).GetProperties();
Dictionary<string, string> output=new Dictionary<string,string>();
foreach(PropertyInfo pi in props)
{
var name = pi.Name,
string value= pi.GetValue(this, null) as string;
output[name]=value;
}
這將不會編譯,'GetValue'返回'object'而不是'string' 。你可能想使用'ToString' –
查看更新回答 – David
爲什麼要使用'as string'?您可能想要在字典中轉儲整數,日期時間和小數。在你的情況下,這個值將是'null' –
注意這僅僅是一個樣品,你應該增加更多的防禦性代碼來檢查類型的字段是否正確等...
一個簡單的方法使用反射:
var a = new A();
.
. fill in a.B... etc
.
.
Dictionary<String, String> dict =
a.GetType()
.GetFields()
.ToDictionary(k => k.Name, v => v.GetValue(a).ToString())
'v.GetValue(null)'這隻會拋出'TargetException'。'GetValue'的參數是對象,你想從中得到 –
這個字段謝謝,但是隨時糾正你的答案 –
對不起,有時候你通過改變答案的語義直接修改他們的答案而生氣了。 –
通過屬性,你的意思是領域或屬性,或兩者?因爲屬性也可能意味着別的東西。此外,您嘗試使用此解決方案解決什麼問題?聽起來有點[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)給我... –
我很困惑..B/C/D是字符串屬性,爲什麼你不直接設置它們? V1應該是什麼類型的數據類型? – James
這可以通過反射來完成,但是也許你真正想要的單詞是'序列化'http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.datacontractserializer.aspx – Seph