Реализация глубокой копии:
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;
}
Существует проект на GitHub/Nuget, названном MetaLinq, который имеет целью делать работу с локоном выражения более легкой.
Это преобразовывает между нормальным Expressions и 'EditableExpressions', которые являются изменяемыми и полностью сериализуемыми, так может использоваться с Json, Xml, Двоичным файлом и т.д.
Также проверка этот сообщение в блоге для большего количества информации
Не полностью; однако, Динамический образец LINQ может помочь немного. Можно, конечно, сериализировать выражение к строке (до степени - дженерики выглядят немного странными), но нет никакого встроенного синтаксического анализатора.
Другой вариант - это проект Сериализация дерева выражений на code.msdn.com - может показаться, что здесь нужно больше?
UPD: Теперь http://archive.msdn.microsoft.com/exprserialization