指定哪个转换器Json。Net序列化程序在处理属性时应该使用,我们通常使用JsonConverterAttribute
,这是一个很好且简洁的语法
但是,由于C#不支持在Attribute中使用泛型类型参数,因此当属性的声明类包含泛型类型参数时会出现问题。这里有一个简单的例子:
public class FooConverter<T> : JsonConverter<T> {
public override void WriteJson(JsonWriter writer, T value, JsonSerializer serializer) {
//Implementation
}
public override T ReadJson(JsonReader reader, Type objectType, T existingValue, bool hasExistingValue, JsonSerializer serializer) {
//Implementation
}
}
public class Bar<T>{
[JsonConverter(typeof(FooConverter<T>))] //CS0416 'T': an attribute argument cannot use type parameters
public T Value { get; set; }
}
我知道我可以实例化一个通用转换器,并在调用JsonConvert.DeserializeObject
时用JsonSerializerSettings传递它,但这需要调用方知道被反序列化类型的实现细节。我所写的是一个库,我不想麻烦我的用户每次需要反序列化这种类型的对象时手动添加转换器
当我的自定义转换器依赖类型参数时,有什么解决方法吗
您需要使用非通用转换器,例如
public class FooConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
// ...
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
// ...
}
public override bool CanRead
{
get { return true; } // or false if you don't need custom read
}
public override bool CanConvert(Type objectType)
{
// ...
}
}
然后可以使用[FooConverter]
作为属性。它不会是类型安全的,但由于泛型的非绑定性质,没有其他方法可以做到这一点。但是,只要在ReadJson
方法中返回objectType
类型的对象,就不会有任何问题。
更多信息请点击此处。