Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
foreach (Object obj in list) {
Type type = obj.GetType();
foreach (var f in type.GetFields().Where(f => f.IsPublic)) {
Console.WriteLine(
String.Format("Name: {0} Value: {1}", f.Name, f.GetValue(obj));
}
}
Примечание, что этот код требует, чтобы.NET 3.5 работала ;-)
public static void ListArrayListMembers(ArrayList list)
{
foreach (Object obj in list)
{
Type type = obj.GetType();
Console.WriteLine("{0} -- ", type.Name);
Console.WriteLine(" Properties: ");
foreach (PropertyInfo prop in type.GetProperties())
{
Console.WriteLine("\t{0} {1} = {2}", prop.PropertyType.Name,
prop.Name, prop.GetValue(obj, null));
}
Console.WriteLine(" Fields: ");
foreach (FieldInfo field in type.GetFields())
{
Console.WriteLine("\t{0} {1} = {2}", field.FieldType.Name,
field.Name, field.GetValue(obj));
}
}
}
я хотел бы упомянуть, что поиск IsPublic в полях не необходим как тип. GetFields (), как определено состояния MSDN:
Возвращаемое значение - Тип: Система. Отражение. FieldInfo []
массив объектов FieldInfo, представляющих весь общедоступные поля определенный для текущего Типа.
Можно получить все поля объекта, объявленные непосредственно в классе с BindingFlags:
GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
и все поля объекта включая наследованный с:
GetFields(BindingFlags.Public | BindingFlags.Instance)
Конечно, другой вопрос был бы, "почему Вы получили общедоступные поля?" - свойства, являющиеся предпочтительным. Как абстракция, обратите внимание, что отражение не является единственной опцией: для типа также возможно выставить, это - свойства на лету во времени выполнения (как то, как невведенный DataTable
/ DataView
выставляет столбцы как свойства).
Для поддержки этого (также поддерживая простые объекты) Вы использовали бы TypeDescriptor
:
foreach(PropertyDescriptor prop in TypeDescriptor.GetProperties(obj))
{
Console.WriteLine("{0}={1}", prop.Name, prop.GetValue(obj));
}
Это также допускает многочисленные опции расширяемости - например, значительно убыстряющееся отражение (не изменяя кода).
static void ListArrayListMembers(ArrayList list)
{
foreach (object obj in list)
{
Type type = obj.GetType();
foreach (FieldInfo field in type.GetFields(BindingFlags.Public))
{
Console.WriteLine(field.Name + " = " + field.GetValue(obj).ToString());
}
}
}