Из мира PHP я решил попробовать C #. У меня был поиск, но я не могу найти ответ, как это сделать.
$object = new Object();
$vars = get_class_vars(get_class($object));
foreach($vars as $var)
{
doSomething($object->$var);
}
У меня в основном есть список объекта. Объект может быть одного из трех различных типов и будет иметь набор открытых свойств. Я хочу иметь возможность получить список свойств объекта, зациклить их, а затем записать их в файл. Я думаю, что это как-то связано с отражением в c #, но для меня все это ново.
Любая помощь будет принята с благодарностью.
c#
reflection
m4rc
источник
источник
Ответы:
Это должно сделать это:
источник
System.Reflection
namespacePropertyInfo[] props = input.GetType().GetProperties();
Newtonsoft.Json.JsonConvert
?источник
Да, Reflection был бы подходящим вариантом. Во-первых, вы получите тот,
Type
который представляет тип (во время выполнения) экземпляра в списке. Вы можете сделать это, вызвавGetType
методObject
. Поскольку он находится вObject
классе, он может вызываться каждым объектом в .NET, поскольку все типы являются производнымиObject
( ну, технически, не все , но это здесь не важно).Получив
Type
экземпляр, вы можете вызватьGetProperties
метод, чтобы получитьPropertyInfo
экземпляры, которые представляют информацию времени выполнения о свойствах объектаType
.Обратите внимание, что вы можете использовать перегрузки,
GetProperties
чтобы помочь классифицировать, какие свойства вы получаете.Оттуда вы просто записали бы информацию в файл.
Ваш код выше, переведенный, будет:
Обратите внимание, что если вы хотите получить информацию о методе или поле, вам необходимо вызвать одну из перегрузок методов
GetMethods
илиGetFields
соответственно.Также обратите внимание, что одно дело перечислить элементы в файле, но вы не должны использовать эту информацию для управления логикой на основе наборов свойств.
Предполагая, что у вас есть контроль над реализациями типов, вы должны наследовать общий базовый класс или реализовывать общий интерфейс и выполнять их вызовы (вы можете использовать оператор
as
or,is
чтобы определить, с каким базовым классом / интерфейсом вы работаете). во время выполнения).Однако, если вы не управляете этими определениями типов и вынуждены управлять логикой, основанной на сопоставлении с образцом, то это нормально.
источник
ну, в C # это похоже. Вот один из простейших примеров (только для открытых свойств):
источник
Чтобы получить конкретное значение свойства из имени свойства
получить доступ к значению свойства Name из строкового имени свойства
источник
Вы можете использовать GetType - GetProperties - Linq Foreach :
источник
Однолинейное решение с использованием Linq ...
источник
Вот что я использую для преобразования
IEnumerable<T>
в a,DataTable
который содержит столбцы, представляющиеT
свойства, с одной строкой для каждого элемента вIEnumerable
:Это «несколько» слишком сложно, но на самом деле это очень хорошо, чтобы увидеть, каков будет результат, как вы можете, например, дать
List<T>
:И вам будет возвращен DataTable со структурой:
С одной строки на элемент в вашем
List<Car>
источник
Этот пример обрезает все строковые свойства объекта.
источник
Я не нашел это для работы, скажем, объекты приложения. Я, однако, имел успех с
источник
источник
источник
Вы можете попробовать это:
Однажды каждый массив реализует интерфейс IEnumerable
источник