Однако, когда в это перечисление передается неизвестное значение, оно вызывает ошибку, поскольку отправляет строковое значение, которое не может быть сопоставлено с целым числом. В идеале мы хотели бы написать какой-нибудь форматировщик или поведение для перехвата значений перечисления и определения их допустимости. Если это действительно так, продолжайте вызов как обычно. Если оно недействительно, просто используйте целочисленное значение и игнорируйте строковое значение. Очевидно, что этот подход не будет работать в тех случаях, когда это перечисление необходимо по деловым причинам, но в большинстве случаев эти перечисления нужно просто передать через запрос.
Это можно сделать, добавив пользовательские заголовки, которые содержат как int, так и строковое значение перечисления, а затем обрабатывают его перед десериализацией, но мне не удалось заставить что-либо подобное работать правильно, и заголовки, похоже, не сохраняют необходимую мне информацию (но это может быть отдельная проблема; я пока не уверен).
Ниже приведен пример предыдущей попытки использования суррогата, взятый из этого, но ошибка, похоже, возникает до этого код, поэтому не работает должным образом.
Код: Выделить всё
///
/// Custom Data Contract Surrogate that De/Serializes enum values as their underlying values instead of strings (default WCF)
/// To avoid issues with newly introduced enum values on updated WCF services and older clients.
///
public class EnumValueDataContractSurrogate : IDataContractSurrogate
{
#region Interface Implementation
public Type GetDataContractType(Type type)
{
return type;
}
public object GetObjectToSerialize(object obj, Type targetType)
{
if(null == obj)
{
return obj;
}
if(targetType.IsNullable())
{
targetType = targetType.GetUnderlyingType();
}
if (targetType.IsEnum)
{
return EnumExtensions.ChangeToUnderlyingType(targetType, obj);
}
return obj;
}
public object GetDeserializedObject(object obj, Type targetType)
{
if ((false == targetType.IsEnum) || (null == obj))
{
return obj;
}
if (targetType.IsNullable())
{
targetType = targetType.GetUnderlyingType();
}
var stringObj = obj as string;
if (null != stringObj)
{
return Enum.Parse(targetType, stringObj);
}
return Enum.ToObject(targetType, obj);
}
public void GetKnownCustomDataTypes(Collection customDataTypes)
{
//not used
return;
}
public object GetCustomDataToExport(Type clrType, Type dataContractType)
{
//Not used
return null;
}
public object GetCustomDataToExport(MemberInfo memberInfo, Type dataContractType)
{
//not used
return null;
}
public Type GetReferencedTypeOnImport(string typeName, string typeNamespace, object customData)
{
//not used
return null;
}
public CodeTypeDeclaration ProcessImportedType(CodeTypeDeclaration typeDeclaration, CodeCompileUnit compileUnit)
{
//not used
return typeDeclaration;
}
#endregion
}
Подробнее здесь: https://stackoverflow.com/questions/782 ... ns-of-enum
Мобильная версия