Показать сообщение отдельно
Старый 09.07.2016, 14:02   #4
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: System.Reflection и сериализация свойств

Сообщение от h1dd3n Посмотреть сообщение
MemberInfo это информация о члене класса (как и следует из названия).
А член класса это:
- поле
- свойство
- метод
- конструктор
- событие
- вложенный тип (вложенный класс, структура, перечисление)
- что-то еще что я забыл

Так как MemberInfo это класс для всех выше перечисленных членов класса, то что ты хочешь получить от него? Какой-то "тип"? Но у конструктора нету типа. Поэтому и у класса MemberInfo нет возможности "получить тип".
Однако если у тебя задача сериализовать все поля и свойства, ты можешь у MemberInfo взять свойство MemberType (то есть проверить что текущий член класса это либо поле либо свойство). MemberTypes это перечисление. И дальше проверить - если MemberTypes.Property, то сделать
var propertyInfo = (PropertyInfo) memberInfo;
а вот уже у PropertyInfo есть информация о типе свойства propertyInfo.PropertyType
аналогично
var fieldInfo = (FieldInfo) memberInfo;

https://dotnetfiddle.net/z1IMim

А вообще странно как ты получил MemberInfo. В рефлексии есть удобные методы GetProperties() (возвращает PropertyInfo[]) и GetFields() (возвращает FieldInfo[]). Воспользовался бы ими - вообще проблемы не возникло бы.
Я делал так, но получается нужно перебирать сначало одно, потом другое, так как именно сериализоровать нужно с определенным атрибутом (EditByUser).
А так получается 1 проход.

Так и сделал.Проверял что за член и кастовал к нему.

И еще нельзя сериализировать object предварительно не приведя его к однозначному типу (.
Не канает даже;
o = (float) o;
не сериалзует такие объекты(

А так хотелось динамическую типизацию.
Просто у меня структура:
 public Component instance;
            public string EditorName;
            public string name;
            
            [SerializeField]
            private object value;

            //[SerializeField]
            private MemberInfo info;

            [SerializeField]
            private string objectType;

            [SerializeField]
            private string instanceType;
И как-то нужно сериализовать value.

Кароче, я что-то кастомный сериализатор написал...
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием