【发布时间】:2021-03-26 13:43:13
【问题描述】:
此代码在默认构造函数中运行良好。如何从带参数的构造函数创建对象?
private readonly JsonSerializer _serializer;
private static readonly IReadOnlyDictionary<TypeId, Type> _derivedTypes;
static ByTypeIdConverter()
{
var baseType = typeof(T);
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
_derivedTypes = (
from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
from assemblyType in domainAssembly.GetTypes()
where !assemblyType.IsAbstract && assemblyType.IsSubclassOf(baseType)
select assemblyType).ToDictionary(t => (TypeId)t);
}
public override T? ReadJson(JsonReader reader, Type objectType, T? existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var jObject = JObject.Load(reader);
var typeId = jObject["_t"]?.ToObject<TypeId>();
if (typeId is null || !_derivedTypes.TryGetValue(typeId, out var classType))
throw new JsonSerializationException("Failed to get derived class type from json or found type was not expected");
var creator = _serializer.ContractResolver.ResolveContract(classType).DefaultCreator;
if (creator is null)
{
throw new JsonSerializationException($"Failed create instance of type {classType.Name}");
}
var result = creator();
_serializer.Populate(jObject.CreateReader(), result);
return (T)result;
}
一些附加信息我有 SomeBase 类和该基类的自定义 JsonConverter。我只是像这样反序列化:
JsonConvert.DeserializeObject<SomeBase>(jsonData);
【问题讨论】:
-
你想从哪里得到那些构造函数参数值? json字符串中有没有?常量?
-
我添加了一些细节。也许这会更清楚问题
-
是的,我已经看到了这个解决方案。还有其他解决方案吗?喜欢通用方式?在这个例子中,它是更多的静态定义
-
如果你想使用构造函数初始化一个类。然后您可以将 JSON 解析为 JObject 并将所需的参数传递给构造函数。然后,如果您仍想复制所有值。您可以使用 PopulateObject 方法复制所有值。
标签: c# json json.net converters