C #: Как удалить все нулевые свойства из универсального объекта с помощью отражения? - PullRequest
2 голосов
/ 03 мая 2009

Я хочу удалить все нулевые свойства в универсальном объекте. Это не должно быть рекурсивно, один уровень глубины тоже подойдет.

Мне нужна специальная реализация JavascriptConvertor для сериализации JSON, которая дает мне: {"Name": "Aleem", "Age": null, "Type": "Employee"}

И я бы хотел пропустить нулевой объект.

Функция для этой задачи берет объект и возвращает словарь:

IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)

Итак, я хотел бы удалить все нулевые свойства из obj. Все свойства имеют getter, но если свойство не установлено, getter возвращает null.

Ответы [ 4 ]

4 голосов
/ 04 мая 2009

Вы можете реализовать свой собственный JavaScriptConverter для обработки сериализации вашего типа. Тогда вы получите полный контроль над тем, как свойства сериализуются.

@ Ответ Ричардса - хорошая реализация метода Serialize.

Метод десериализации будет очень похож, но я оставлю реализацию на ваше усмотрение. Теперь единственным недостатком JavaScriptConverter является то, что он должен откуда-то получать поддерживаемые типы. Либо жестко запрограммируйте это так:

public override IEnumerable<Type> SupportedTypes
{ 
    get
    {
        var list = new List<Type>{ typeof(Foo), typeof(Bar)...};
        return list.AsReadOnly();
    }
}

... или сделать его настраиваемым, например через конструктор класса.

4 голосов
/ 04 мая 2009

Что-то вроде следующего, вероятно, сработает:

public IDictionary<string, object> GetNonNullProertyValues(object obj)
{
    var dictionary = new Dictionary<string, object>();

    foreach (var property in obj.GetType().GetProperties())
    {
        var propertyValue = property.GetValue(obj, null);
        if (propertyValue != null)
        {
            dictionary.Add(property.Name, propertyValue);
        }
    }

    return dictionary;
}

Примечание: этот метод не обрабатывает индексированные свойства.

1 голос
/ 04 мая 2009
 using System.IO;
 using System.Runtime.Serialization.Json;

    public static class JsonExtensions
    {
        public static string ToJson<T>(this T instance) 
        {
            var serializer = new DataContractJsonSerializer(typeof(T));
            using (MemoryStream memoryStream = new MemoryStream())
            {
                serializer.WriteObject(memoryStream, instance);

                memoryStream.Flush();
                memoryStream.Position = 0;

                using (var reader = new StreamReader(memoryStream))
                {
                    return reader.ReadToEnd();
                }
            }
        }

        public static T FromJson<T>(this string serialized) 
        {
            var serializer = new DataContractJsonSerializer(typeof(T));
            using (MemoryStream memoryStream = new MemoryStream())
            {
                using (StreamWriter writer = new StreamWriter(memoryStream))
                {
                    writer.Write(serialized);
                    writer.Flush();

                    memoryStream.Position = 0;

                    return (T)serializer.ReadObject(memoryStream);
                }
            }
        }
    }
0 голосов
/ 03 мая 2009

Возможно, вы захотите создать какой-то объект обтекания, который раскрывает только элементы обертываемого объекта, если они не равны нулю.

Вы также можете проверить версию 4 C #. Начиная с запись в википедии о вводе утки :

Версия 4 выпуска C # имеет дополнительные введите аннотации, которые инструктируют компилятор для организации проверки типов классов, чтобы происходить во время выполнения, а чем компилировать время, и включать код проверки типа во время выполнения в скомпилированный вывод. Такие дополнения позволяют язык, чтобы насладиться большей частью Преимущества утиной печати только с Недостатком является необходимость выявления и указать такие динамические классы в время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...