Я пытаюсь сериализовать объект с несколькими свойствами, но не хочу включать все свойства при сериализации.
Конечно, я мог бы использовать атрибут [XmlIgnore], но мне необходима возможность делать это динамически.
Вопрос заключается в следующем как исключить некоторые свойства при серилизации не изменяя исходного класса, при это хотелось бы иметь строгую типизацию.
Заранее спасибо.
Ответ
сделать это можно следующим образом.
Воспользуемся готовым классом XmlAttributeOverrides но сделаем пару методов расширений для добавления строгой типизации:
public static class XmlAttributeOverridesHelpers
{
public static void Add
public static string BuildString(this Expression propertySelector)
{
switch (propertySelector.NodeType)
{
case ExpressionType.Lambda:
LambdaExpression lambdaExpression = (LambdaExpression)propertySelector;
return BuildString(lambdaExpression.Body);
case ExpressionType.Convert:
case ExpressionType.Quote:
UnaryExpression unaryExpression = (UnaryExpression)propertySelector;
return BuildString(unaryExpression.Operand);
case ExpressionType.MemberAccess:
MemberExpression memberExpression = (MemberExpression)propertySelector;
MemberInfo propertyInfo = memberExpression.Member;
if (memberExpression.Expression is ParameterExpression)
{
return propertyInfo.Name;
}
else
{
// we've got a nested property (e.g. MyType.SomeProperty.SomeNestedProperty)
return BuildString(memberExpression.Expression) + "." + propertyInfo.Name;
}
default:
// drop out and throw
break;
}
throw new InvalidOperationException("Expression must be a member expression: " + propertySelector.ToString());
}
}
применять можно следующим образом:
var overrides = new XmlAttributeOverrides();
var ignore = new XmlAttributes { XmlIgnore = true };
overrides.Add
Решение было найдено здесь
Комментариев нет:
Отправить комментарий