Да, Отражение - это путь. Сначала вы получите Type
, который представляет тип (во время выполнения) экземпляра в списке. Вы можете сделать это, позвонив по номеру GetType
method on Object
. Поскольку он находится на классе Object
, он может быть вызван каждым объектом в .NET, так как все типы происходят от Object
(well, technically, not everything, но это не важно здесь).
После того, как у вас есть экземпляр Type
, вы можете вызвать GetProperties
method получить PropertyInfo
экземпляры, которые представляют собой во время выполнения informationa о свойствах на Type
.
Примечание. Вы можете использовать перегрузки GetProperties
, чтобы помочь классифицировать которые свойства, которые вы извлекаете.
Оттуда вы просто напишите информацию в файл.
Вашего код выше, перевод был бы:
// The instance, it can be of any type.
object o = <some object>;
// Get the type.
Type type = o.GetType();
// Get all public instance properties.
// Use the override if you want to classify
// which properties to return.
foreach (PropertyInfo info in type.GetProperties())
{
// Do something with the property info.
DoSomething(info);
}
Обратите внимание, что если вы хотите получить информацию метод или информацию о полях, вы должны вызвать один из перегрузок GetMethods
или GetFields
методов соответственно.
Также обратите внимание, что это одно, чтобы перечислять членов в файл, но вы не должны использовать эту информацию для логики привода на основе наборов свойств.
Предполагая, что у вас есть контроль над реализациями типов, вы должны получить общий базовый класс или реализовать общий интерфейс и совершать вызовы (вы можете использовать оператор as
или is
, чтобы определить, какой базовый класс/интерфейс, с которым вы работаете во время выполнения).
Однако, если вы не контролируете эти определения типов и должны управлять логикой на основе соответствия шаблонов, то это нормально.
В качестве примечания: наличие объектов различных типов в списке (без общий базовый класс или интерфейс) не является хорошим стилем программирования, по крайней мере, не в C#. –