我正在尝试为一个集合编写一个接口,该集合在内部将数据存储为JObject
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;
}
并尝试像这样实现 add 方法:
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
?