可为空时自动解析自定义结构

时间:2019-03-29 09:52:11

标签: c# asp.net-web-api2

我有一个自定义结构,如下所示:

public struct Date
{
    private int _year;
    private int _month;
    private int _day;
    public Date(string myDate)
    {
        var date = DateTime.ParseExact(myDate, "yyyy-MM-dd");
        _year = date.Year;
        _month = date.Month;
        _day = date.Day;
    }
    public int Year => _year;
    public int Month => _month;
    public int Day => _day;
}

这是一个可以发布到我的webApi的模型,如下所示:

public class MyData
{
    public int? MyIntValue {get;set;}
    public string MyStringValue {get;set;}
    public Date? MyDateValue {get;set;}
}

非空类型被设置为可空,因为它们对于此消息是可选的。

给出如下所示的消息,并将其发布到我的webApi

{
    "MyIntValue": 5,
    "MyStringValue": "Hello",
    "MyDateValue": "2019-03-29"
}

我希望能够使用该字符串,并将其解析为我的Date结构。

我的第一个调用端口是TypeConverter装饰我的Date结构 因此,我编写了一个如下所示的转换器DateConverter

public class DateConverter : TypeConverter
{
    public override bool CanConverterFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if (value is string stringValue)
        {
            return new Date(stringValue);
        }
        return base.ConvertFrom(context, culture, value);
    }
}

并用Date装饰我的[TypeConverter(typeof(DateConverter))]结构

但是这不起作用。经过一些(冗长的)调查后,我认为这是因为模型上的类型实际上是Nullable<T>。因此,在进一步挖掘之后,我发现了NullableConverter。对我的TypeConverter的修改使其看起来像这样

public class DateConverter : NullableConverter
{
    public DateConverter() : base(typeof(Date?)) {}

    public override bool CanConverterFrom(ITypeDescriptorContext context, Type sourceType)
    {
        return sourceType == typeof(string) || base.CanConvertFrom(context, sourceType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if (value is string stringValue)
        {
            return new Date(stringValue);
        }
        return base.ConvertFrom(context, culture, value);
    }
}

我现在看到DateConverter构造函数在消息中发布时被命中(是!),但是我陷入了导致StackOverflowException的循环中,因为我相信{{1} }在其构造函数中被赋予Nullable Type,它将查看基础类型并解析其TypeConverter(如果有),并以这种方式继续。在NullableConverter结构上设置NullableConverter后,它会不断解析为Date并四处走动...

这是我的调查已停止的地方。我现在可以在DateConverter上找到很少的信息,或者将其作为装饰类型的NullableConverter的任何实际用法,我可以确定这是我需要使用的类。

我做错了什么吗?我是关闭了,还是只是驼峰而已...还是我正在看这个完全错误的方面。

我的问题是这个:

如何将给定的Json放入我的WebAPI中,其中TypeConverter已正确解析为我的自定义类型

该模型是生成的代码,因此,我宁愿不要在模型上装饰该成员(如果该方法仍然可行,则我不会尝试)。但是,如果那是唯一可行的方法,我将把这种变化提交给有关方面,并看看有什么需要。

进一步的调查表明,如果我恢复到之前的MyDateValue(不是TypeConverter),则会调用NullableConverter并返回true,但随后不会调用CanConvertFrom 。这样,它似乎也不会再次调用ConvertFrom。也许Asp.Net在内部缓存了该类型的结果。

0 个答案:

没有答案