Я предполагаю, что вы пытаетесь определить универсальный способ «сбрасывать» объект, ничего не зная о его структуре.Если так, то вы идете о вещах в правильном направлении.Вы используете отражение (GetType()
и соответствующие методы класса Type
) для проверки объекта и возврата его информации.
Причина, по которой GetFields()
ничего не вернула, состоит в том, что вы, вероятно, не предоставили праваобязательные флаги.В частности, если вы вызываете перегрузку, которая не принимает никаких параметров, вы получаете только поля public
;если вам нужны закрытые поля, вам нужно специально их запрашивать.
В вашем случае GetFields(BindingFlags.NonPublic)
вернет вам поля _new_systemGauges
и _new_systemAlarm
, а GetProperties () вернет вам *Свойства 1012 * и New_systemAlarm
.
Другой ключевой элемент, который вы пропустили, заключается в том, что возвращаемые вами данные - это метаданные типа ;он определяет структуру class
, а не какой-либо конкретный экземпляр.Если вы хотите узнать, каково значение свойства для конкретного экземпляра, вам нужно спросить об этом:
foreach (var prop in obj.GetType().GetProperties())
{
Console.WriteLine("{0} = {1}", prop.Name, prop.GetValue(obj, null));
}
Если у вас есть один из PropertyInfo
элементов из метаданных типа, вы можетезапросить значение этого свойства в любом экземпляре этого типа.Это не должен быть тот же экземпляр, который вы использовали изначально.Например:
var objs = somelist.Where(x => x.Id == 1);
foreach (var prop in objs.First().GetType().GetProperties())
{
int x = 0;
foreach (var obj in objs)
{
if (prop.PropertyType.Name.Equals("Int32"))
{
int val = (int)prop.GetValue(obj, null);
Console.WriteLine("Obj #{0}: {1} = 0x{2:x8}", x++, prop.Name, val);
}
else if (prop.PropertyType.Name.Equals("Decimal"))
{
int val = (decimal)prop.GetValue(obj, null);
Console.WriteLine("Obj #{0}: {1} = {2:c2}", x++, prop.Name, val);
}
else
{
Console.WriteLine("Obj #{0}: {1} = '{2}'", x++, prop.Name, prop.GetValue(obj, null));
}
}
}
Технически вы должны проверить результат GetIndexParameters
, чтобы увидеть, проиндексировано или нет свойство;параметр null
в GetValue
на самом деле является массивом значений индекса.
Чтобы преобразовать возвращаемое вами значение, вы можете либо использовать typecasts, либо, если вы хотите быть немного более гибким, использовать Convertметоды класса.Разница, например, в том, что, если у вас есть свойство short
, GetValue()
вернет короткое представление в штучной упаковке, которое вы не сможете затем ввести как int
;сначала нужно распаковать его на short
.Использование Convert.ToInt32()
выполнит все необходимые шаги для получения значения int
из любого свойства, которое преобразуется в целое число.
Преобразование между ссылочными типами проще, поскольку вы можетепросто используйте для этого is
и as
;они работают так же, как и следовало ожидать с «отраженными» значениями свойств.