Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在另一个自定义转换器内使用转换器序列化枚举_C#_Json.net - Fatal编程技术网

C# 如何在另一个自定义转换器内使用转换器序列化枚举

C# 如何在另一个自定义转换器内使用转换器序列化枚举,c#,json.net,C#,Json.net,我有一个自定义的JSON转换器,因为第三方API只接受特定的结构 public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var bodyRequest = (IRequest) value; writer.WriteStartObject(); writer.WritePropertyName(bodyRequest.RequestName);

我有一个自定义的JSON转换器,因为第三方API只接受特定的结构

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
{
   var bodyRequest = (IRequest) value;
   writer.WriteStartObject();
   writer.WritePropertyName(bodyRequest.RequestName);
   writer.WriteStartObject();
   writer.WritePropertyName("-xmlns");
   writer.WriteValue("http://example.com");
   writer.WritePropertyName(bodyRequest.WrapperName);
   writer.WriteStartObject();

   var contractResolver = new CamelCasePropertyNamesContractResolver {
    IgnoreSerializableAttribute = false
   };
   var properties = value.GetType().GetProperties();

   foreach(var propertyInfo in properties) {
    if (HasAttribute(propertyInfo, typeof(JsonIgnoreAttribute))) {
     continue;
    }
    var propValue = propertyInfo.GetValue(value);    
    var propertyName = contractResolver.GetResolvedPropertyName(propertyInfo.Name);
    writer.WritePropertyName(propertyName);
    writer.WriteValue(propValue);

   }
   writer.WriteEndObject();
   writer.WriteEndObject();
   writer.WriteEndObject();
}
因此,我使用
WriteXXX
方法创建structure,然后获取所有属性并序列化它们。一切正常,但我需要处理枚举。例如,我们有以下请求模型:

public class ExampleRequest : IRequest
{
   public long Id{ get; set; }

   [JsonConverter(typeof(StringEnumConverter))]
   public CarType CarType { get; set; }

   public string RequestName => "Request";
   public string WrapperName => "SendData";
}

public enum CarType
{
   [EnumMember(Value = "NEW_CAR")
   New,
   [EnumMember(Value = "OLD_CAR")
   Old
}

目前,序列化后,我看到
CarType
的数值为0或1,我知道我使用反射,而
StringEnumConverter
被忽略。在这种情况下如何正确序列化?

在循环中,检查属性是否应用了
JsonConverterAttribute
。如果是这样,请获取转换器的类型,实例化它,然后调用其
WriteJson
方法,而不是直接写入值。否则,只需像现在这样编写值

换言之,替换此行:

writer.WriteValue(propValue);
为此:

var att = propertyInfo.GetCustomAttribute<JsonConverterAttribute>();
if (att != null)
{
    var converter = (JsonConverter)Activator.CreateInstance(att.ConverterType);
    converter.WriteJson(writer, propValue, serializer);
}
else
{
    writer.WriteValue(propValue);
}
var att=propertyInfo.GetCustomAttribute();
如果(att!=null)
{
var converter=(JsonConverter)Activator.CreateInstance(att.ConverterType);
WriteJson(writer、propValue、serializer);
}
其他的
{
writer.WriteValue(propValue);
}

将尝试。谢谢