我有一个自定义结构,如下所示:
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在内部缓存了该类型的结果。