2017-04-12 108 views
2

我们有一个web api项目,并将日期时间转换为日期,反之亦然,我们使用从JsonConverter扩展的DateTimeconverter。 我们在所有所需的日期时间属性的属性的形式使用该(如下所示):Web API - JsonConverter - 自定义属性

[JsonConverter(typeof(CustomDateConverter))] 

的CustomDateConverter是如下:

public class CustomDateConverter: JsonConverter 
{ 
    private string[] formats = new string[] { "yyyy-MM-dd", "MM/dd/yy", "MM/dd/yyyy", "dd-MMM-yy" }; 

    public CustomDateConverter(params string[] dateFormats) 
    { 
     this.formats = dateFormats; 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(DateTime); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     // custom code 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     // custom code 
    } 
} 

我的问题是如何可以定义一个自定义的构造函数,而使用属性?

回答

2

当由Json.NET构造时,可以使用[JsonConverterAttribute(Type,Object[])]属性构造函数将参数传递到CustomDateConverter。此构造自动设置ConverterParameters属性:

public class RootObject 
{ 
    [JsonConverter(typeof(CustomDateConverter), new object [] { new string [] { "dd-MMM-yy", "yyyy-MM-dd", "MM/dd/yy", "MM/dd/yyyy" } })] 
    public DateTime DateTime { get; set; } 
} 

注意的是,在JsonConverterAttribute构造并在构造函数中使用的params可能会导致人们认为正确的语法是

[JsonConverter(typeof(CustomDateConverter), new object [] { "dd-MMM-yy", "yyyy-MM-dd", "MM/dd/yy", "MM/dd/yyyy" })] 

然而,这将不行。 Json.NET通过Type.GetConstructor(Type [])寻找一个具有适当签名的构造函数 - 而你的构造函数的反射签名显示了一个参数,即一个字符串数组。

fiddle