試圖弄清楚如何創建一個方法來迭代對象的屬性,並輸出它們(比如現在稱爲console.writeline)。一種迭代傳入的對象屬性的方法
這可能使用反射嗎?
例如
public void OutputProperties(object o)
{
// loop through all properties and output the values
}
試圖弄清楚如何創建一個方法來迭代對象的屬性,並輸出它們(比如現在稱爲console.writeline)。一種迭代傳入的對象屬性的方法
這可能使用反射嗎?
例如
public void OutputProperties(object o)
{
// loop through all properties and output the values
}
請嘗試以下
public void OutputProperties(object o) {
if (o == null) { throw new ArgumentNullException(); }
foreach (var prop in o.GetType().GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) {
var value = prop.GetValue(o,null);
Console.WriteLine("{0}={1}", prop.Name, value);
}
}
這將輸出的具體類型聲明的所有屬性。如果任何屬性在評估時拋出異常,它將會失敗。
是的,你可以使用
foreach (var objProperty in o.GetType().GetProperties())
{
Console.WriteLine(objProperty.Name + ": " + objProperty.GetValue(o, null));
}
使用TypeDescriptor
,允許自定義對象模型的替代方法在運行時顯示靈活特性(即你所看到的可不僅僅是什麼是在類的更多,並且可以使用自定義類型轉換器做字符串轉換):
public static void OutputProperties(object obj)
{
if (obj == null) throw new ArgumentNullException("obj");
foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
{
object val = prop.GetValue(obj);
string s = prop.Converter.ConvertToString(val);
Console.WriteLine(prop.Name + ": " + s);
}
}
注意,反射是默認實現 - 但許多其他更有趣的模式是可能的,通過ICustomTypeDescriptor
和TypeDescriptionProvider
。
內部是不是他們使用反射? – mrblah 2009-10-06 23:46:23