Сериализация и десериализация деревьев выражений в C#

Реализация глубокой копии:

public static object CloneObject(object opSource)
{
    //grab the type and create a new instance of that type
    Type opSourceType = opSource.GetType();
    object opTarget = CreateInstanceOfType(opSourceType);

    //grab the properties
    PropertyInfo[] opPropertyInfo = opSourceType.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

    //iterate over the properties and if it has a 'set' method assign it from the source TO the target
    foreach (PropertyInfo item in opPropertyInfo)
    {
        if (item.CanWrite)
        {
            //value types can simply be 'set'
            if (item.PropertyType.IsValueType || item.PropertyType.IsEnum || item.PropertyType.Equals(typeof(System.String)))
            {
                item.SetValue(opTarget, item.GetValue(opSource, null), null);
            }
            //object/complex types need to recursively call this method until the end of the tree is reached
            else
            {
                object opPropertyValue = item.GetValue(opSource, null);
                if (opPropertyValue == null)
                {
                    item.SetValue(opTarget, null, null);
                }
                else
                {
                    item.SetValue(opTarget, CloneObject(opPropertyValue), null);
                }
            }
        }
    }
    //return the new item
    return opTarget;
}
89
задан Cherian 5 April 2009 в 06:15
поделиться

3 ответа

Существует проект на GitHub/Nuget, названном MetaLinq, который имеет целью делать работу с локоном выражения более легкой.

Это преобразовывает между нормальным Expressions и 'EditableExpressions', которые являются изменяемыми и полностью сериализуемыми, так может использоваться с Json, Xml, Двоичным файлом и т.д.

Также проверка этот сообщение в блоге для большего количества информации

13
ответ дан Pop Catalin 24 November 2019 в 07:22
поделиться

Не полностью; однако, Динамический образец LINQ может помочь немного. Можно, конечно, сериализировать выражение к строке (до степени - дженерики выглядят немного странными), но нет никакого встроенного синтаксического анализатора.

2
ответ дан Marc Gravell 24 November 2019 в 07:22
поделиться

Другой вариант - это проект Сериализация дерева выражений на code.msdn.com - может показаться, что здесь нужно больше?

UPD: Теперь http://archive.msdn.microsoft.com/exprserialization

14
ответ дан 24 November 2019 в 07:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: