gpt4 book ai didi

c# - 我怎么知道一个类型是否可以使用 Json.NET 转换?

转载 作者:太空狗 更新时间:2023-10-30 00:52:57 26 4
gpt4 key购买 nike

我正在尝试为内部将数据存储为 JObject 的集合编写一个接口(interface)

internal class JsonDataSet : IDataSet
{
private JObject Document { get; set; }

// The following methods are from the IDataSet interface
public int Count { ... }
public void Add<T>(string key, T value) { ... }
public T GetItem<T>(string key) { ... }
public bool ContainsKey(string key) { ... }
}

Add<T>如果自定义类型没有 DataContract,我想提供一个有用的异常方法注解。例如,如果有人打电话:

dataSet.Add<IDictionary<string, IList<CustomType>>>(dict);

它会抛出异常"Cannot serialize type 'CustomType'. DataContract annotations not found."如果CustomType没有正确的注释。

到目前为止,我已经找到了一种方法来获取类型定义中的每个泛型参数,以便我可以检查它们:

private IEnumerable<Type> GetGenericArgumentsRecursively(Type type)
{
if (!type.IsGenericType) yield return type;

foreach (var genericArg in type.GetGenericArguments())
foreach (var yieldType in GetGenericArgumentsRecursively(genericArg ))
yield return yieldType;
}

并尝试像这样实现添加方法:

public void Add<T>(string key, T value)
{
foreach(var type in GetGenericArgumentsRecursively(typeof(T)))
{
if(!type.IsPrimitive && !Attribute.IsDefined(type, typeof(DataContractAttribute)))
throw new Exception("Cannot serialize type '{0}'. DataContract annotations not found.", typeof(T));
}

Document.Add(new JProperty(key, JToken.Parse(JsonConvert.SerializeObject(value))));
}

我认为这适用于原始类型和自定义类型,但不适用于非泛型 .NET 类型,因为它们并非都具有 DataContract注释。有没有办法知道哪些类型可以被 JsonConvert 序列化? ?

最佳答案

Json.NET 支持几乎所有类型,甚至是那些没有任何自定义属性的类型。支持的属性包括 DataContract、JsonObject、Serializable。有多种方法可以使 Json.NET 在序列化中包含一个成员,也有多种方法可以使其跳过。如果您无法序列化某些类,则更有可能是由于缺少 Data* 属性以外的问题引起的:成员抛出异常、缺少构造函数、错误的转换器、可见性问题等。您的错误消息不太可能比Json.NET.

如果您想事先进行测试,则必须从 Json.NET 复制大量逻辑。检查类型和成员属性是不够的。仅验证用于属性的转换器就需要至少检查五个地方。即使您完成了所有这些工作,这也是不够的,因为在新版本中,Json.NET 中将引入新的类型或转换器或特性或属性,您将不得不再次完成所有这些工作。

测试类型是否可以序列化的唯一可靠方法是尝试对其进行序列化。

关于c# - 我怎么知道一个类型是否可以使用 Json.NET 转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18708217/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com